【发布时间】:2013-10-01 04:51:21
【问题描述】:
目前我们有一个关于 MySQL 在枚举字段中的排序顺序的有趣问题。字段枚举条目已按我们想要的顺序排序。为了节省起见,我们在其周围添加了一个 CONCAT,因此它将被转换为 char 并按字母顺序排序,正如 MySQL 参考 (MySQL Reference - Enum) 所建议的那样
通过编码 ORDER BY CAST(col AS CHAR) 或 ORDER BY CONCAT(col) 确保该列按词法排序,而不是按索引号排序。
但这并没有产生预期的结果,因此我们开始进一步调查。似乎 order by 语句不适用于 enum 和 concat 函数的组合。我编写了以下示例脚本,它应该说明我的观点:
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO test
VALUES ('b'), ('c'), ('a');
SELECT * FROM test; -- b, c, a
SELECT * FROM test ORDER BY col1 ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS CHAR) ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS BINARY) ASC; -- a, b, c
SELECT * FROM test ORDER BY CONCAT(col1) ASC; -- b, c, a - This goes wrong
我目前怀疑排序规则/编码存在某种问题,但我不确定。我的数据库默认编码也是 utf8。 MySQL 版本是 5.6.12,但它似乎可以用 MySQL 5.1 重现。存储引擎是 MyIsam,但它也出现在内存引擎中。
任何帮助将不胜感激。
更新:
问题似乎只在 MySQL 5.6 和列的排序规则中产生。使用第一个 CREATE TABLE 语句,查询工作正常。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_general_ci DEFAULT NULL
)
第二个他们没有。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
)
表和/或数据库的排序规则似乎不会影响查询。查询可以在这个SQL Fiddle进行测试
【问题讨论】:
-
只是一个小信息:我目前正在使用 MariaDB 10.3.11,并且该错误在那里无法重现。
标签: mysql sorting character-encoding enums concat