【问题标题】:UTF8 string comparisons in MySQLMySQL中的UTF8字符串比较
【发布时间】: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

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

【问题讨论】:

标签: mysql collation case-sensitive


【解决方案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,那么您最终使用了哪种排序规则?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2018-02-20
相关资源
最近更新 更多