【发布时间】: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/…
标签: mysql collation case-sensitive