2011-12-13 88 views
2

我在排序MySQL中的char字段時遇到困難。問題在於重音字符與非重音字符混合在一起。例如:MySQL排序順序 - 整理?

Abc 
Ábd 
Acc 

我認爲這可能與排序規則有關。因此,在閱讀this post後,我將表格的排序規則更改爲utf8-ut8_bin。實際上,我將表格多次更改爲各種排序規則。沒有雪茄。

我還應該補充說,只要排序不會導致混合列表,我不介意排序的順序。換句話說,這是好的:

Ábd 
Abc 
Acc 

所以是這樣的:

Abc 
Acc 
Ábd 

期待您的回覆。

+0

你如何希望他們進行排序?根據哪種排序規則? – newtover

+0

對不起,我編輯了原文,以描述所需的行爲。 – hba

回答

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) 
+0

感謝您的詳細回覆。我已經將模式和表格更改爲排序規則utf8_bin,但仍然無效。然後我跑你的查詢並得到一個錯誤。看着列和列有默認的排序規則。我將列更改爲utf8_bin,然後運行。再次感謝。 – hba

+0

這種方法無法解釋_equality_。 –

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

(你可以在添加DISTINCTGROUP_CONCAT以避免重複A。)

這裏是utf8排序規則的完整概要(使用該技術):http://mysql.rjweb.org/utf8_collations.html

建議你點擊「我的影響」上https://bugs.mysql.com/bug.php?id=58797