MySQL排序顺序 - 排序规则?

Posted

技术标签:

【中文标题】MySQL排序顺序 - 排序规则?【英文标题】:MySQL Sort Order - Collation? 【发布时间】:2012-01-19 10:56:29 【问题描述】:

我很难在 mysql 中对 char 字段进行排序。问题是重音字符与非重音字符混合在一起。例如:

Abc
Ábd
Acc

我认为这可能与排序规则有关。所以我在阅读this post 后将表格的排序规则更改为utf8-ut8_bin。实际上,我多次将表格更改为各种排序规则。没有雪茄。

我还应该补充一点,只要排序不会导致混合列表,我不介意排序的顺序。换句话说,这很好:

Ábd
Abc
Acc

所以是这样的:

Abc
Acc
Ábd

期待您的回复。

【问题讨论】:

您希望它们如何排序?根据哪个排序规则? 抱歉,我编辑了原始帖子以描述所需的行为。 【参考方案1】:

@newtower 有一个很好的起点,但他和“社区”都没有意识到这是不确定的。所以我提供了一个应该“修复”它的答案:

unicode_ci(以及几乎所有其他排序规则):

SET NAMES utf8 COLLATE utf8_unicode_ci;

SELECT GROUP_CONCAT(l SEPARATOR '=') AS gc
  FROM (
    SELECT 'A' as l  UNION ALL
    SELECT 'á' as l  UNION ALL
    SELECT 'A' as l              ) ls
  GROUP BY l
  ORDER BY gc;

+--------+
| gc     |
+--------+
| A=á=A  |
+--------+

斌:

SET NAMES utf8 COLLATE utf8_bin;

SELECT GROUP_CONCAT(l SEPARATOR '=') AS gc
  FROM (
    SELECT 'A' as l  UNION ALL
    SELECT 'á' as l  UNION ALL
    SELECT 'A' as l              ) ls
  GROUP BY l
  ORDER BY gc;

+------+
| gc   |
+------+
| A=A  |
| á    |
+------+

(您可以在GROUP_CONCAT 中添加DISTINCT 以避免重复A。)

这里是 utf8 排序规则的完整概要(使用该技术):http://mysql.rjweb.org/utf8_collations.html

建议你点击https://bugs.mysql.com/bug.php?id=58797上的“影响我”

【讨论】:

【参考方案2】:

您只需要使用区分大小写的排序规则,例如:utf8_general_cs

UPD

对不起,it seems 没有utf8_general_csutf8_bin 应该可以工作。

并且您应该更改特定字段的排序规则而不是表的排序规则(或确保该字段确实使用表默认值)。

mysql> SELECT * FROM (
    -> SELECT 'A' as l
    -> UNION ALL
    -> SELECT 'á' as l
    -> UNION ALL
    -> SELECT 'A' as l) ls
    -> ORDER BY l;
+----+
| l  |
+----+
| A  |
| á  |
| A  |
+----+
3 rows in set (0.00 sec)

mysql> SELECT * FROM (
    -> SELECT 'A' as l
    -> UNION ALL
    -> SELECT 'á' as l
    -> UNION ALL
    -> SELECT 'A' as l) ls
    -> ORDER BY l COLLATE utf8_bin;
+----+
| l  |
+----+
| A  |
| A  |
| á  |
+----+
3 rows in set (0.00 sec)

【讨论】:

感谢您的详细回复。我已将架构和表更改为整理 utf8_bin ,但它仍然无法正常工作。然后我运行了你的查询并得到了一个错误。查看了该列,该列具有默认排序规则。我将列更改为 utf8_bin 然后它起作用了。再次感谢。 这种方法没有考虑到平等

以上是关于MySQL排序顺序 - 排序规则?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 按指定规则排序

Mysql中的UTF-8字符集与字符集排序规则的选择

在没有定义排序规则的情况下订购 MySQL 字符串结果?

mysql汉字排序规则

MySQL 排序

当所有排序规则都已经标准化时,Mysql 非法混合排序规则