我很难在MySQL中对char字段进行排序。问题是重音字符与未加重音的字符混在一起。例如:
Abc
Ábd
Acc
我认为这可能与整理有关。因此,在阅读this post后,我将表格整理改为utf8-ut8_bin
。实际上,我将表格多次更改为各种排序规则。没有雪茄。
我还应该补充一点,只要排序不会产生混合列表,我就不介意排序的顺序。换句话说,这很好:
Ábd
Abc
Acc
这是这样的:
Abc
Acc
Ábd
期待您的回复。
答案 0 :(得分:1)
您只需使用区分大小写的排序规则,例如: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)
答案 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
上的“影响我”