MySQL 行排序没有意义

MySQL row ordering doesn't make sense

所以,我有一个带有 varchar(255) name 字段的标准产品 table。令我困惑的是,当对名称字段进行排序时,如下面的 Workbench 屏幕截图所示,'&' 字符的值高于 '-'。

我已将这些字符隔离开来,以确保没有任何其他神秘符号扰乱排序。不是这样的。

有人可以请教我这个吗? '&' 的 ASCII 值是 38 而 '-' 是 45。所以 id 3212 应该是第一个。我真的很好奇这里发生了什么。

MySQL: 版本 8.0.26

Table 排序规则:utf8mb4_unicode_ci

引擎:InnoDB

基本上,unicode 排序顺序不同于 ASCII 排序顺序。

由于多种语言可能使用相同的 unicode 符号来表示不同的字符,因此每种语言需要以不同的方式实现字符排序。

所以他们转而使用 Unicode Collation Algorithm

这些链接可能会帮助您更多地了解为什么会这样排序,但是,您可能需要花费更多的精力来更改排序顺序(如果您正在尝试这样做)做)。

https://www.effectiveperlprogramming.com/2011/01/know-your-sort-orders/

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html#charset-unicode-sets-collating-weights

检查方法如下:

mysql> SELECT '&' > '-' COLLATE utf8mb4_unicode_ci;
+--------------------------------------+
| '&' > '-' COLLATE utf8mb4_unicode_ci |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT '&' > '-' COLLATE utf8mb4_bin;
+-------------------------------+
| '&' > '-' COLLATE utf8mb4_bin |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.00 sec)

如果你真的想比较十六进制,一定要使用一些以 _bin.

结尾的排序规则