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

标签 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

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

第二个问题 - 在表上执行以下语句:

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

同时删除字母u的所有文本。为什么?

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

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

返回lettera而不是ā的结果。

编辑:好的,最后2个问题也可以通过在letter前加上BINARY来解决。

最佳答案

您正在使用 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

关于mysql utf-8奇怪的文本问题-排序、删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24477688/

相关文章:

php - file_get_contents() 分解 UTF-8 字符

powershell - 如何在 PowerShell 中正确/全局地转换 UTF-8(无 BOM)文件? (到另一个文件)

JavaScript blob 编码为 UTF-8 而不是 ANSI

python - 将推文编码为 UTF-8 在 Python 中创建奇怪的字符

mysql - MySQL 数据库结构的良好实践

MYSQL - 计算单个表内的差异

mysql - 获取某个字段的所有值都具有特定值的 id

python - 加载 MySQLdb 模块时出错 : No module named 'MySQLdb'

ios - 为什么 emoji 有两个不同的 utf-8 编码?如何从 utf-8 转换表情符号,在 ios 中使用 NSString?

php - 我将如何以 HTML 形式创建这个数组结构?