MySQL排序顺序 - 整理?

时间:2011-12-13 15:07:28

标签: mysql sorting collation

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

Abc
Ábd
Acc

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

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

Ábd
Abc
Acc

这是这样的:

Abc
Acc
Ábd

期待您的回复。

2 个答案:

答案 0 :(得分:1)

您只需使用区分大小写的排序规则,例如: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)

答案 1 :(得分:0)

@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  |
| á    |
+------+

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

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

建议您点击https://bugs.mysql.com/bug.php?id=58797

上的“影响我”