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).