UTF-8 vs Latin1 mysql,未在utf-8上使用的索引

时间:2010-02-15 13:35:37

标签: mysql encoding

我尝试用UTF-8和Latin1 Char集创建我的mysql表。当我使用Latin1时,我使用了索引,当我使用UTF-8时,在选择/限制记录时不使用索引。 Char集中是否存在导致这种情况发生的事情?

干杯

3 个答案:

答案 0 :(得分:8)

仅当表达式的排序规则与索引列上的排序规则匹配时,才能使用索引。

如果表达式的COERCIBILITY低于列的2,那么列的排序规则将转换为表达式的排序规则,并且不使用索引。

通常情况下,文字的COERCIBILITY4,用户变量为3,因此这应该不是问题。

但是,如果您在JOINUNION中混合使用不同的排序规则,则无法保证转换顺序。

在这种情况下,您应该为正在投射的列提供显式排序规则(最有可能的是,您希望将latin1转换为UTF8),这应该是您要投射的列的排序规则到:

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

答案 1 :(得分:3)

我现在理解这一点,我加入的表格不是同一个字符集

DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

一旦我改变了这些,索引工作正常。

答案 2 :(得分:1)

索引本身使用与它们索引的列相同的编码进行存储。将UTF-8字符与latin1字符进行比较不能使用索引,因为它需要将两者转换为相同的编码,因为索引优化是在字节级别上执行的(并且latin1中的ß具有不同于UTF-8的字节序列。