【问题标题】:mysql utf-8 weird text problems - ordering, deletionmysql utf-8 奇怪的文本问题——排序、删除
【发布时间】:2014-08-20 02:10:17
【问题描述】:

相关问题:mysql select distinct letters, including extended latin characters

没有人费心回答最后一个问题,所以我正在创建一个新问题。

使用此表数据:http://pastebin.com/cH2DUzf3

并对其执行以下查询:

SELECT DISTINCT BINARY `letter` FROM `texts` ORDER BY `letter` ASC

产生几乎完美的结果,但有一个例外:字母 ūu 之前。谁能解释一下?从逻辑上讲,字母uū 的基本版本,顺序应该是u, ū。为什么不是这样?所有其他字母的顺序都正确。

第二个问题——对表执行如下语句:

DELETE FROM `texts` WHERE `letter` = 'ū'

同时删除letteru 的所有文本。为什么?

用拉脱维亚字母查询数据的同样问题:

SELECT * FROM `texts` WHERE `letter` = 'ā'

返回lettera,而不是ā 的结果。

编辑:好的,最后两个问题也可以通过将BINARY 放在letter 之前来解决。

【问题讨论】:

  • 这两个字符的字符代码是什么?
  • 我不知道。我在哪里可以检查?
  • 您的数据在哪个 unicode 规范化形式中?为字段 letter 设置了哪些排序顺序和字符集?
  • @Deduplicator - 什么是unicode normalization form???另外,检查一下 pastebin 怎么样?

标签: mysql utf-8


【解决方案1】:

您使用utf8_general_ci 作为排序规则。它使用了一种快速但不准确的比较算法,它只是忽略了字母上的重音。它适用于英语,但适用于大多数其他语言。

改用utf8_latvian_ciutf8_unicode_ci 之类的东西。

utf8_unicode_ci 使用Unicode collation algorithm。它也是最慢的。

utf8_latvian_ci 使用简化的排序算法,专注于支持拉脱维亚字母:http://collation-charts.org/mysql60/mysql604.utf8_latvian_ci.html

编辑:好吧,我错了。没有内置的排序规则可以使 MySQL 在它们的非重音变体之后对重音字母进行排序,同时还保留字母顺序。

您可以使用此处的指南编写自己的排序规则:http://dev.mysql.com/doc/refman/5.0/en/ldml-collation-example.html

【讨论】:

  • 嗯,这令人失望。但问题是,我不仅有英文和拉脱维亚文字符,还有俄文字符,而且将来可能会出现更多(例如,立陶宛文/爱沙尼亚文)。使用utf8_latvian_ci 感觉不对。
  • 俄语适用于所有变体,包括 utf8_general_ci。我想 utf8_unicode_ci 将是最安全的选择。我会扩展我的答案。请注意,在立陶宛语中,y 介于 įj 之间,而不是 xz
  • 更改为 utf8_unicode_ci,删除/创建表,重新生成数据 - 在 u 之前仍然是 ū
  • 根据collation-charts.org/mysql60/…u (0055) 在ū (016A) 之前。什么可以解释这种行为?
  • 在同一行,所以认为相等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2012-04-11
  • 2012-01-20
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多