MySQL中的UTF8字符串比较

Posted

技术标签:

【中文标题】MySQL中的UTF8字符串比较【英文标题】:UTF8 string comparisons in MySQL 【发布时间】:2011-10-24 19:27:47 【问题描述】:

我们在 mysql 5 中遇到了关于大小写和重音的 utf8 字符串比较问题:

从我收集到的信息来看,MySQL 通过考虑“字符组应该被视为相等”来实现排序规则。

例如,在utf8_unicode_ci 排序规则中,所有字母“EÉÈÊeéèê”都在同一个框中(连同“e”的其他变体)。

因此,如果您有一个包含 ["video"、"vidéo"、"vidÉo"、"vidÊo"、"vidêo"、"vidÈo"、"vidèo"、"vidEo"] 的表(在声明为 varchar 的列中ut8_general_ci 排序规则):

当要求 MySQL 根据该列对行进行排序时,排序是随机的(例如 MySQL 不强制执行“é”和“É”之间的排序规则), 当要求 MySQL 在此列上添加唯一键时,它会引发错误,因为它认为所有值都相等。

我们可以用什么设置来修复这两点?

PS:在相关说明中,我没有看到 utf8 字符集的任何区分大小写的排序规则。我错过了什么吗?


[edit] 我认为我最初的问题仍然有一些兴趣,我会保持原样(也许有一天会得到肯定的答案)。

然而,事实证明,我们关于重音的字符串比较问题与我们的文本列的排序规则无关。它与与 MySQL 对话时 character_set_client 参数的配置问题有关 - 默认为 latin1

这篇文章向我们解释了这一切,并允许我们解决问题:

Getting out of MySQL character set hell

这很长,但相信我,你需要这个长度来解释问题和解决方法。

【问题讨论】:

在 NCR 形式中,EÉÈÊeéèê 都是不同的。它们的值是:E É È Ê é è ê 使用utf8_unicode_ci 链接已损坏 - 但 InternetArchive 有:web.archive.org/web/20141120180423/https://www.bluebox.net/… 【参考方案1】:

使用将这些字符视为不同的排序规则。也许是 utf8_bin (它区分大小写,因为它对字符进行二进制比较)

http://dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html

【讨论】:

我的意思是:难道没有一个可以同时允许两者的排序规则吗?考虑这些不同的字符并以一致的顺序对它们进行排序? 我不确定,但如果没有,您可以创建自己的排序规则(从 MySQL 5.5 开始)dev.mysql.com/doc/refman/5.5/en/adding-collation.html @LeGEC,是的,_bin 的排序顺序是一致的,因为这些值是明确排序的。当他们已经允许两者时,“允许两者”是什么意思? @Pacerier:你是对的:在utf8_bin 中排序总是会给出相同的顺序;不过,我在想“与人类一致”:à 大于 a 且小于 bé 大于 e 且小于 d 等...以便按名称(例如)给出最终用户的期望。 @LeGEC,那么您最终使用了哪种排序规则?

以上是关于MySQL中的UTF8字符串比较的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的 UTF8 字符串比较

Mysql----字符集和比较规则

MySQL编码latin1转utf8

MySQL 字符集utf8和utf-8的关系

Mysql utf8mb3 utf8mb4 与UTF8 字符集参数(character_set_system)的说明

为什么不建议在MySQL中使用 utf8?