2014-06-29 12 views
0

相關問題:mysql select distinct letters, including extended latin charactersMySQL的UTF-8怪異文字的問題 - 排序,刪除

沒有人打擾關於最後一個問題回答,所以我創建一個新的問題。

使用此表中的數據:http://pastebin.com/cH2DUzf3

,並在其上執行以下查詢:

SELECT DISTINCT BINARY `letter` FROM `texts` ORDER BY `letter` ASC 

得到近乎完美的效果,但有一個例外:信ūu之前。任何人都可以解釋嗎?邏輯上,字母uū的基本版本,訂單應爲u, ū。爲什麼不是這樣?所有其他字母的順序都是正確的。

問題二 - 執行上表下面的語句:

DELETE FROM `texts` WHERE `letter` = 'ū' 

也將刪除所有文字,其中letteru。爲什麼?

同樣的問題與拉脫維亞字母查詢數據:

SELECT * FROM `texts` WHERE `letter` = 'ā' 

返回結果,其中lettera,不ā

編輯:好的,最後兩個問題也可以通過在letter之前加BINARY來解決。

+0

什麼是上面提到的兩個字符的字符代碼? –

+0

我不知道。我在哪裏可以檢查? – jurchiks

+0

哪個** unicode規範化表單**是你的數據?字段'letter'設置了什麼排序和字符集? – Deduplicator

回答

1

您正在使用utf8_general_ci作爲整理。它使用一種快速但不準確的比較算法,它僅僅忽略字母上的重音。它適用於英語,但對大多數其他語言無效。

改爲使用類似utf8_latvian_ciutf8_unicode_ci的東西。

utf8_unicode_ci使用Unicode collation algorithm。這也是最慢的。

utf8_latvian_ci使用簡化歸類算法專注於支持拉脫維亞字母:http://collation-charts.org/mysql60/mysql604.utf8_latvian_ci.html

編輯:好吧,我錯了。沒有內置的排序規則可以使MySQL在不確定變體之後對重音字母進行排序,同時還保留字母順序。

您可以編寫自己的整理,這裏使用指南:http://dev.mysql.com/doc/refman/5.0/en/ldml-collation-example.html

+0

嗯,這是令人失望的。但事情是,我不只是英文和拉脫維亞文字,我還有俄文,而且未來可能會出現更多(例如立陶宛/愛沙尼亞語)。使用'utf8_latvian_ci'只是感覺不對。 – jurchiks

+0

俄羅斯將使用所有變種,包括utf8_general_ci。我猜utf8_unicode_ci將是最安全的選擇。我會擴大我的答案。請注意,在立陶宛語中,'y'在'į'和'j'之間,而不是'x'和'z'。 –

+0

更改爲'utf8_unicode_ci',刪除/創建表格,重新生成數據 - 在'u'之前仍然是'ū'。 – jurchiks