mysql - MySQL 5.5 中可以使用什么排序规则对日文字符进行排序?
问题描述
我有一个带有 utf8mb4 字符集的数据库,我一直在尝试选择数据为日文字符的记录,但 utf8mb4_general_ci 排序规则似乎无法正确排序结果。例如,以下字符按 desc 顺序显示:
小松
児玉
什么时候应该:
児玉
小松
解决方案
好的,对于可能遇到同样情况的其他人。这是我找到的解决方案。所以,我读了这篇文章
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)”作为解决我的问题的解决方法。
推荐阅读
- mysql - 关于 SQL 触发器语法的问题
- c# - 在asp.net c#中将数据从数据表导出到excel
- mysql - 使用表白名单选项更新 Debezium MySQL 连接器
- python - Reuse a class's method in the main.py
- c# - 编辑极端情况,在 c# 中检查 null
- debugging - 如何指示 GDB 在我的所有函数中放置断点而不会变慢?
- javascript - 提高具有通用模式的多个 if 语句的可读性
- c# - 将网页嵌入工业电脑
- javascript - 使用 Python 使用 Thread 在后台运行 javascript
- javascript - 为什么人们说javascript没有二维数组?