mysql utf-8奇怪的文本问题 - 排序,删除

时间:2014-06-29 15:49:27

标签: mysql utf-8

相关问题: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之前也可以解决最后2个问题。

1 个答案:

答案 0 :(得分: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