UTF-8 против Latin1 mysql, индексы не используются в utf-8

Я попытался создать свои таблицы mysql с наборами символов UTF-8 и Latin1. Когда я использую Latin1, мои индексы используются, когда я использую UTF-8, индексы не используются при выборе / ограничении записей. Есть ли что-то, чего мне не хватает в наборах Чаров, которые вызывают это?

ура

Ke

3 ответа

Решение

Индексы можно использовать только тогда, когда сопоставление выражения совпадает с сопоставлением в индексированном столбце.

Если выражение COERCIBILITY ниже, чем у столбца (то есть 2), сопоставление столбца приводится к сопоставлению выражения, и индекс не используется.

Обычно литералы имеют COERCIBILITY из 4 и пользовательские переменные, что из 3, так что это должно быть не проблемой.

Тем не менее, если вы смешаете различные параметры сортировки в JOIN или же UNION, порядок приведения не гарантируется.

В этом случае вы должны предоставить явное сопоставление столбцу, который вы используете (скорее всего, вы хотите привести latin1 в UTF8), и это должно быть сравнение столбца, к которому вы приводите:

SELECT  *
FROM    utf_table
JOIN    latin_table
ON      utf_column = latin_column COLLATE UTF8_GENERAL_CI

Теперь я понимаю, что таблицы, к которым я присоединился, не совпадали

DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

После того как я изменил эти индексы работали нормально.

Сами индексы хранятся в той же кодировке, что и столбцы, которые они индексируют. Сравнение символа UTF-8 с символом латинского 1 не может использовать индекс, потому что потребуется преобразовать оба в одну и ту же кодировку, поскольку оптимизации индекса выполняются на уровне байтов (и ß в латинице 1 имеет другую последовательность байтов, чем в UTF-8).

Другие вопросы по тегам