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_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 然后它起作用了。再次感谢。 这种方法没有考虑到平等。以上是关于MySQL排序顺序 - 排序规则?的主要内容,如果未能解决你的问题,请参考以下文章