查询结果中的排序规则非法混合,为什么不将其全部更改为utf8_general_ci

问题描述 投票:0回答:1

我们从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.

在我们公司,没有人对此有足够的了解。有什么原因使我不应该执行此操作?

mysql collation
1个回答
0
投票

移动到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上显式的习惯。表的字符集和排序规则是表中新列的默认值

然后在连接上有字符集和排序规则。这很重要,因为它在客户端中声明了字节的编码(字符集)。连接的排序规则可能会影响您提出的问题。 (对不起,但是在提出您的问题之前,有很多基础工作要做。)因此,使排序规则与您的数据库和表保持一致。

© www.soinside.com 2019 - 2024. All rights reserved.