MySQL中的UTF8字符串比较

时间:2011-08-11 09:21:07

标签: mysql collation case-sensitive

我们在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字符集的任何区分大小写的排序规则。我错过了什么吗?


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

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

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

Getting out of MySQL character set hell

这是冗长的,但请相信我,你需要这个长度来解释问题和修复。

1 个答案:

答案 0 :(得分:2)

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

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