2012-09-15 76 views
2

我想在我的MySQL查詢中自定義按字母排序的順序。 馬耳他語使用標準的拉丁字母與人物一起:Çħż。我使用utf8_bin排序規則,因爲ċc(依此類推)不相同。 這樣做,當我使用ORDER BY,字母的順序處理結果:MySQL自定義字母順序

a b c d e f g h i j k l m n o p q r s t u v w x y z ċ ġ ħ ż 

但是我要求他們有這樣的順序:

a b ċ c d e f ġ g h ħ i j k l m n o p q r s t u v w x y ż z 

這意味着,按升序排列,「 「abċ」應該在之前「abz」,但目前它來之後,因爲它只是比較字符的二進制值。有沒有辦法在MySQL中實現這種自定義排序?

我見過像this這樣的解決方案,它使用ORDER BY FIELD(name, 'a', 'b', 'ċ', ...),但這似乎不適用於這種情況。

我也嘗試添加排序功能,如下所示:ORDER BY radicals COLLATE utf8_unicode_ci,但這基本上將重音字符視爲相同。所以,我會得到有序的字符串,如「ACD」,「王牌」,「ACF」,但也是錯誤的(應該是「ACD」,「ACF」,「王牌 「)。

我的備用計劃當然是在PHP中進行排序,但如果我可以將排序保留到MySQL本身,它將會更加整潔。有任何想法嗎?

回答

3

在MySQL中,整理定義瞭如何排序和分組是字符集處理。如果您的排序規則已經由特定語言定義,那麼正確的排序規則可能已經存在。

此列出當前的排序規則:http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html

否則,您可以添加自己的自定義歸類:http://dev.mysql.com/doc/refman/5.5/en/adding-collation.html

編輯:重新閱讀我看到你已經嘗試了各種排序的問題 - 所以你可能只需要添加您自己的自定義一個。

+0

我沒有考慮過,如果不重新編譯MySQL(這絕對不是一個選項),添加排序規則是可能的。感謝您的鏈接,我會確實嘗試這樣做。 –

0

您仍然可以使用FIELD,但它測試字符串之間的相等性。 因爲在你的情況下,所有的參數都是1個字符的字符串,你將不得不使用ORDER BY FIELD(LEFT(name, 1), 'a', ...)。它只會排序的第一個字符,但...

+0

感謝您的想法,但可惜只選第一個字符是不足以滿足我的需求。 –

2

我已經採取了加文Towey的意見,並寫了這樣一個整理自己。如果有人在將來過這個失蹄並有興趣,有一個GitHub的倉庫在這裏:Maltese MySQL Collation (utf8_maltese_ci)

+0

這是超級酷!我很高興這個建議很有幫助,看到你的工作成果真的很有趣。感謝分享它。 –