我有一个带有utf8mb4字符集的数据库,我一直试图选择数据在日本字符中的记录,但是utf8mb4_general_ci排序规则似乎无法正确地排序结果。例如,下面的字符按desc顺序显示:
小松児玉
当它应该是:
児玉小松
发布于 2021-10-18 09:58:30
好吧,对于那些可能在这种情况下结结巴巴的人来说。这是我找到的解决办法。所以,我读了这篇文章
MySQL 5.5常见问题: 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表中搜索304 B和304 C,并找到以下行: 304 B;.1E57.0020.000E.304B # HIRAGANA字母KA 304 C;.1E57.0020.000E.304B # HIRAGANA字母GA;QQCM --官方的Unicode名称(跟随“#”标记)告诉我们日语音节(Hiragana)、非正式分类(字母、数字或标点符号)和西方标识符(KA或GA,它们恰好是同一字母对的发音和清音成分)。更重要的是,两行的主权重(方括号内的第一个十六进制数)为1E57。对于搜索和排序中的比较,MySQL只注意主权重,忽略了所有其他数字。这意味着我们正在根据Unicode规范正确地对が和か进行排序。如果我们想要区分它们,就必须使用非UCA (Unicode排序算法)排序规则(utf8_bin或utf8_general_ci),或者比较HEX()值,或者使用s1进行转换(s1使用sjis)。当然,“根据Unicode”是正确的是不够的:提交错误的人也是一样的正确。我们计划根据JIS 4061标准为日语添加另一个排序规则,在该标准中,像KA/GA这样的浊音/清音字母对是可以区分的。
正如这篇文章所建议的,我使用“(s1使用sjis)”来解决我的问题。
https://stackoverflow.com/questions/69613658
复制相似问题