【问题标题】:MySQL row ordering doesn't make senseMySQL 行排序没有意义
【发布时间】:2021-10-24 03:47:38
【问题描述】:

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

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

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

MySQL:版本 8.0.26

表格整理:utf8mb4_unicode_ci

引擎:InnoDB

【问题讨论】:

  • 由于名称与“-”和“&”相同,如果您执行以下操作是否正确排序:ORDER BY name DESC
  • 嗨 ihatzi,谢谢你的回答。是的,全列排序最初就在那里。 substr 是为了调试/“显示(因为缺少更好的词 atm)”目的而完成的。
  • 啊,现在说得通了 :)

标签: mysql sorting mysql-workbench


【解决方案1】:

基本上,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

【讨论】:

  • 感谢您的回答。请给我一点时间阅读所有这些,然后我会接受它。
  • PERL 链接特别好。我很高兴我遇到了这个问题。干杯人。
【解决方案2】:

这是一种检查方法:

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 结尾的排序规则。

【讨论】:

  • 谢谢。在阅读您的答案时,我想起了我在问题的产品表上遇到的另一个奇怪的异常情况。它有 SKU varchar(16) 列,在正常使用时(如... where sku = 'abc123')与字符串功能正常。但是,引入变量会给出:Error Code: 1267. Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=' 在任何其他列上使用变量都可以正常工作。在设置变量set @sku = 'ABO01FB' COLLATE utf8mb4_unicode_ci; 时使用您的方法可以很好地解决问题。
  • 数据库排序规则似乎是一个该死的兔子洞;)
  • 是的,一个兔子洞。 SHOW VARIABLES LIKE 'char%';SHOW VARIABLES LIKE 'col%';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多