[英]MySQL wrong order of UTF-8 words
當我在表列中添加UTF-8單詞並執行有序的SELECT時,排序順序是錯誤的。 在DESC排序上,順序正確,但在ASC排序上,順序錯誤。 如何解決? 讓我解釋一個例子。 讓我們用斯洛伐克語整理一個mysql表:
CREATE TABLE IF NOT EXISTS test (
aaa varchar(255) CHARACTER SET utf8 COLLATE utf8_slovak_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci;
現在讓我們插入一些帶有UTF-8單詞的值:
INSERT INTO test (aaa) VALUES
('Leco'),
('Lečo'),
('Ledo'),
('Chovatelstvo'),
('Chovateľstvo')
這是斯洛伐克語字母的說明,您可以看到哪些字母后面是其他字母: http : //en.wikipedia.org/wiki/斯洛伐克語orthography
現在,當我按順序選擇時,我希望得到以下結果:
SELECT aaa FROM test ORDER BY aaa ASC
Chovatelstvo
Chovateľstvo
Leco
Lečo
Ledo
我也期望DESC的順序完全相反。 但是,這實際上是我得到的:
SELECT aaa FROM test ORDER BY aaa ASC
Chovateľstvo
Chovatelstvo
Leco
Lečo
Ledo
和DESC:
SELECT aaa FROM test ORDER BY aaa DESC
Ledo
Lečo
Leco
Chovateľstvo
Chovatelstvo
你可以在那里看到
Chovateľstvo
Chovatelstvo
無論ASC還是DESC,總是以給定的順序。 我注意到,如果我以相反的順序插入行,它可能會以
Chovatelstvo
Chovateľstvo
表示實際順序相反,但是對於ASC和DESC來說,順序相同。 就像mysql認為這兩個字母“ l”和“ľ”相等。
我在某些舊版本的MySQL以及另一台服務器上的最新版本的MariaDB中進行了嘗試,結果是相同的。
知道是什么原因造成的,以及如何解決?
在utf8_slovak_ci
和utf8_general_ci
歸類中,字母ľ
和字母l
被認為是相同的。
您可以通過觀察該查詢返回true(1)來查看此信息。
select _utf8 'Chovateľstvo' collate utf8_slovak_ci = _utf8 'Chovatelstvo'
該排序規則的設計者顯然認為ľ
和l
在字典中屬於一起。 我可以找到的唯一排序規則不是latin2_hungarian_ci
和cp1250_czech_cs
。 但是要使用其中任何一種,都必須更改字符集選擇。
如果必須使它們不同,則可以嘗試utf8_bin
排序規則。 但這將完全區分大小寫。
ORDER BY
工作方式對於排序規則中的規則基本上是正確的。
排序規則中可能有缺陷嗎? 您可以在https://bugs.mysql.com/向MySql團隊提交缺陷報告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.