MySQL排序顺序 - 排序规则是什么?

3

我在MySQL中排序一个字符字段时遇到了困难。问题在于带重音符号的字符与不带重音符号的字符混淆在一起。例如:

Abc
Ábd
Acc

我认为这可能与排序规则有关,因此我根据这篇文章的阅读内容,将表的排序规则更改为utf8-ut8_bin。事实上,我多次更改了表的排序规则,但都不成功。
我还应该补充一点,只要排序不会导致混合列表,我就不介意排序顺序。换句话说,下面这个顺序也可以:
Ábd
Abc
Acc

并且这个也是:

Abc
Acc
Ábd

期待您的回复。


你希望它们按照什么方式排序?根据哪种排序规则? - newtover
抱歉,我编辑了原帖以描述所需的行为。 - hba
2个回答

2
你只需要使用区分大小写的排序规则,例如:utf8_general_cs
更新:
非常抱歉,据报道,似乎没有utf8_general_cs,但utf8_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排序规则,然后它就可以正常工作了。再次感谢。 - hba
这种方法未能考虑到“平等”。 - Rick James

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接