【问题标题】:MySQL wrong order of UTF-8 wordsMySQL UTF-8 单词的错误顺序
【发布时间】:2015-04-07 15:48:47
【问题描述】:

当我将 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/Slovak_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,结果是一样的。

知道是什么原因造成的以及如何解决它吗?

【问题讨论】:

标签: mysql sorting utf-8


【解决方案1】:

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 团队提交缺陷报告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-20
    • 2019-02-09
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2016-02-04
    相关资源
    最近更新 更多