我尝试用UTF-8和Latin1 Char集创建我的mysql表。当我使用Latin1时,我使用了索引,当我使用UTF-8时,在选择/限制记录时不使用索引。 Char集中是否存在导致这种情况发生的事情?
干杯
柯
答案 0 :(得分:8)
仅当表达式的排序规则与索引列上的排序规则匹配时,才能使用索引。
如果表达式的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
答案 1 :(得分:3)
我现在理解这一点,我加入的表格不是同一个字符集
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
一旦我改变了这些,索引工作正常。
答案 2 :(得分:1)
索引本身使用与它们索引的列相同的编码进行存储。将UTF-8字符与latin1字符进行比较不能使用索引,因为它需要将两者转换为相同的编码,因为索引优化是在字节级别上执行的(并且latin1中的ß
具有不同于UTF-8的字节序列。