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字符串比较的主要内容,如果未能解决你的问题,请参考以下文章