我们从MYSQL中收到此错误消息:例如,在搜索结果中,排序规则(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,IMPLICIT)的非法混合。
collation_connection = utf8_general_ci
collation_database = latin1_swedish_ci
collation_server = latin1_swedish_ci
collation tables = a mix of latin1_swedish_ci and utf8_general_ci
collation columns = a mix of latin1_swedish_ci and utf8_general_ci
collation fields = a mix of latin1_swedish_ci and utf8_general_ci
所以我的建议是将其全部更改为utf8_general_ci
我测试了列+字段:
ü Ü ï € á à é É [into utf8] ü Ü ï € á à é É, result seems ok. Every character is correct shown.
在我们公司,没有人对此有足够的了解。有什么原因使我不应该执行此操作?
移动到utf8mb4归类而不是utf8会更好。
是的,将几乎所有内容都移到utf8mb4可能是明智的。
如果您使用MySQL 5.5或5.6,则utf8mb4可能存在问题。但是,有解决方法。
有几种转换表的方法,但是只有一种方法是正确的。哪种方法“正确”取决于表中的数据是否混乱。如果SELECT HEX(col) ...
(即“编码”)为latin1,则FCDCEF80E1E0E9C9
将为üÜï€áàéÉ
赋予CHARACTER SET
。对于utf8或utf8mb4,十六进制为C3BCC39CC3AFE282ACC3A1C3A0C3A9C389
。
请参见SHOW VARIABLES LIKE 'chara%';
-其中一些不应更改。要关注的是SET NAMES utf8mb4;
设置的三个。 (再次执行SHOW
,查看哪些内容已更改。然后再执行SET
,将它们取回。)
关于COLLATION
,..._general_ci
最不有趣。但是,除非您深入了解各种语言的比较或排序细节,否则排序规则不会有太大的关系。
数据库的字符集和排序规则是新创建的表的默认值。不用担心,要养成在CREATE TABLE
上显式的习惯。表的字符集和排序规则是表中新列的默认值。
然后在连接上有字符集和排序规则。这很重要,因为它在客户端中声明了字节的编码(字符集)。连接的排序规则可能会影响您提出的问题。 (对不起,但是在提出您的问题之前,有很多基础工作要做。)因此,使排序规则与您的数据库和表保持一致。