繁体   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