首页 > 解决方案 > MySQL 5.5 中可以使用什么排序规则对日文字符进行排序?

问题描述

我有一个带有 utf8mb4 字符集的数据库,我一直在尝试选择数据为日文字符的记录,但 utf8mb4_general_ci 排序规则似乎无法正确排序结果。例如,以下字符按 desc 顺序显示:

小松

児玉

什么时候应该:

児玉

小松

标签: mysqlcollationutf8mb4

解决方案


好的,对于可能遇到同样情况的其他人。这是我找到的解决方案。所以,我读了这篇文章

MySQL 5.5 FAQ:MySQL 中文、日文和韩文字符集

我将在这里发布它所说的片段:

    mysql> SELECT * FROM tj WHERE s1 = 'か';
    +------+
    | s1   |
    +------+
    | が  |
    | か  |
    +------+
2 rows in set (0.00 sec)

第一个结果行中的字符不是我们搜索的字符。MySQL 为什么要检索它?首先我们查找 Unicode 码位值,这可以通过读取 ucs2 版本字符的十六进制数字来实现:

mysql> SELECT s1, HEX(CONVERT(s1 USING ucs2)) FROM tj;
+------+-----------------------------+
| s1   | HEX(CONVERT(s1 USING ucs2)) |
+------+-----------------------------+
| が  | 304C                        |
| か  | 304B                        |
+------+-----------------------------+
2 rows in set (0.03 sec)

现在我们在 4.0.0 allkeys 表中搜索 304B 和 304C,并找到这些行:

304B; [.1E57.0020.000E.304B] # 平假名字母 KA

304C; [.1E57.0020.000E.304B][.0000.0140.0002.3099] # 平假名字母 GA;

QQCM 官方 Unicode 名称(“#”标记之后)告诉我们音节(平假名)、非正式分类(字母、数字或标点符号)和西方标识符(KA 或 GA,它们恰好是浊音和相同字母对的清音分量)。更重要的是,两行的主要权重(方括号内的第一个十六进制数)都是 1E57。对于搜索和排序的比较,MySQL 只关注主权重,忽略所有其他数字。这意味着我们根据 Unicode 规范正确地对 が 和 か 进行了排序。如果我们想区分它们,我们必须使用非 UCA(Unicode 排序算法)排序规则(utf8_bin 或 utf8_general_ci),或者比较 HEX() 值,或者使用 ORDER BY CONVERT(s1 USING sjis)。当然,仅“根据 Unicode”正确是不够的:提交错误的人同样正确。我们计划根据 JIS X 4061 标准为日语添加另一种排序规则,其中 KA/GA 等浊音/清音字母对可区分用于排序目的。

正如文章所建议的,我使用“ORDER BY CONVERT(s1 USING sjis)”作为解决我的问题的解决方法。


推荐阅读