UTF-8 против Latin1 mysql, индексы не используются в utf-8 - PullRequest
8 голосов
/ 15 февраля 2010

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

Приветствия

Ke

Ответы [ 3 ]

8 голосов
/ 15 февраля 2010

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

Если выражение 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
3 голосов
/ 15 февраля 2010

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

DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Как только я изменил их, индексы работали нормально.

1 голос
/ 15 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...