相关问题:mysql select distinct letters, including extended latin characters
没有人愿意回复最后一个问题,所以我正在创建一个新问题。
使用此表数据:http://pastebin.com/cH2DUzf3
并对其执行以下查询:
SELECT DISTINCT BINARY `letter` FROM `texts` ORDER BY `letter` ASC
产生几乎完美的结果,但有一个异常(exception):字母ū
位于u
之前。谁能解释一下吗?从逻辑上讲,字母u
是ū
的基本版本,顺序应该是u,ū
。为什么不是这样呢?所有其他字母的顺序均正确。
第二个问题 - 在表上执行以下语句:
DELETE FROM `texts` WHERE `letter` = 'ū'
同时删除字母
为u
的所有文本。为什么?
使用拉脱维亚字母查询数据时出现同样的问题:
SELECT * FROM `texts` WHERE `letter` = 'ā'
返回letter
为a
而不是ā
的结果。
编辑:好的,最后2个问题也可以通过在letter
前加上BINARY
来解决。
最佳答案
您正在使用 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
关于mysql utf-8奇怪的文本问题-排序、删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477688/