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

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

Abc
Ábd
Acc

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

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

Ábd
Abc
Acc

所以是这样的:

Abc
Acc
Ábd

期待您的回复。

【问题讨论】:

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

标签: mysql sorting collation


【解决方案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 然后它起作用了。再次感谢。
    • 这种方法没有考虑到平等
    猜你喜欢
    • 2011-11-14
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2011-10-22
    • 2010-11-27
    • 2011-08-18
    • 2016-10-03
    相关资源
    最近更新 更多