簡體   English   中英

MySQL的UTF-8字錯誤順序

[英]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_ciutf8_general_ci歸類中,字母ľ和字母l被認為是相同的。

您可以通過觀察該查詢返回true(1)來查看此信息。

select _utf8 'Chovateľstvo' collate utf8_slovak_ci = _utf8 'Chovatelstvo'

該排序規則的設計者顯然認為ľl在字典中屬於一起。 我可以找到的唯一排序規則不是latin2_hungarian_cicp1250_czech_cs 但是要使用其中任何一種,都必須更改字符集選擇。

如果必須使它們不同,則可以嘗試utf8_bin排序規則。 但這將完全區分大小寫。

ORDER BY工作方式對於排序規則中的規則基本上是正確的。

排序規則中可能有缺陷嗎? 您可以在https://bugs.mysql.com/向MySql團隊提交缺陷報告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM