相关问题: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` = 'ū'
也会删除letter
为u
的所有文字。为什么呢?
使用拉脱维亚字母查询数据时遇到同样的问题:
SELECT * FROM `texts` WHERE `letter` = 'ā'
返回letter
为a
而不是ā
的结果。
编辑:好的,将BINARY
放在letter
之前也可以解决最后2个问题。
答案 0 :(得分:1)
您正在使用utf8_general_ci
作为整理。它使用快速但不准确的比较算法,它只是忽略字母上的重音。它适用于英语,但大多数其他语言都失败了。
使用utf8_latvian_ci
或utf8_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