关于排序:MySQL排序顺序 – 整理?

MySQL Sort Order - Collation?

我在MySQL中很难对char字段进行排序。问题是重音字符会与不重音字符混淆。例如:

1
2
3
Abc
ábd
Acc

我想这可能与整理有关。所以我在读了这篇文章之后,把我的表的排序改为utf8-ut8_bin。实际上,我把这个表修改了好几次,以便进行各种排序。不要雪茄烟。

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

1
2
3
ábd
Abc
Acc

这就是:

1
2
3
Abc
Acc
ábd

期待您的回复。


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

UPD

很抱歉,似乎没有utf8_general_cs,但是utf8_bin应该工作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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)


@牛顿有一个很好的起点,但他和"社区"都没有意识到这是不确定的。因此,我提供的答案应该是"修复"它:

unicode_-ci(以及几乎所有其他排序规则):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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  |
+--------+

箱子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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以避免dup A。)

下面是utf8排序的完整概要(使用这种技术):http://mysql.rjweb.org/utf8_collations.html

建议您在https://bugs.mysql.com/bug.php上单击"影响我"?ID=58797