Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL订购方式为';t在Concat上工作(枚举)_Mysql_Sorting_Character Encoding_Enums_Concat - Fatal编程技术网

MySQL订购方式为';t在Concat上工作(枚举)

MySQL订购方式为';t在Concat上工作(枚举),mysql,sorting,character-encoding,enums,concat,Mysql,Sorting,Character Encoding,Enums,Concat,目前,关于枚举字段中MySQL的排序顺序,我们有一个有趣的问题。字段枚举项已按我们希望的顺序排序。为了保存,我们在其周围添加了一个CONCAT,因此它将被转换为char并按字母顺序排序,正如MySQL引用()所建议的那样 确保该列是按词汇排序的,而不是按按按强制转换(col为CHAR)或按CONCAT(col)编码的顺序按索引号排序 但这并没有产生预期的结果,所以我们开始进一步调查。order by语句似乎不适用于enum和concat函数的组合。我已经编写了以下示例脚本,它应该说明我的观点:

目前,关于枚举字段中MySQL的排序顺序,我们有一个有趣的问题。字段枚举项已按我们希望的顺序排序。为了保存,我们在其周围添加了一个CONCAT,因此它将被转换为char并按字母顺序排序,正如MySQL引用()所建议的那样

确保该列是按词汇排序的,而不是按按按强制转换(col为CHAR)或按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中产生,并且是通过列的排序产生的。使用第一个CREATETABLE语句,查询工作正常

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
)

表和/或数据库的排序规则似乎不会影响查询。这些查询可以在这个

中进行测试奇怪的是,它可以在这个小提琴中工作。你有触发器还是什么的

但是,在5.6中出现了混乱:

可能是Mysql错误

此外,如果您以“正确”的顺序在枚举中输入值,它将起作用:

在文件中:

枚举值根据其索引编号进行排序,索引编号取决于 枚举成员在列中列出的顺序 规范。例如,对于ENUM('b','a'),'b'排序在'a'之前

根据:

在枚举文字的
处理
部分下,它指出:

如果将数字存储到枚举列中,则该数字将被视为 将索引转换为可能的值,存储的值是 具有该索引的枚举成员。(但是,这不适用于 加载数据,将所有输入视为字符串。)如果数值为 如果没有匹配项,则仍将其解释为索引 枚举值列表中的字符串。由于这些原因,情况并非如此 建议使用以下枚举值定义枚举列: 比如数字,因为这很容易让人困惑。 例如,下列枚举成员的字符串值为“0”、“1”和“2”,但数值索引值为1、2和3:

如果存储2,它将被解释为 索引值,并变为“1”(索引为2的值)。如果你去商店 “2”,它与枚举值匹配,因此存储为“2”。如果你 存储“3”,它与任何枚举值都不匹配,因此将对其进行处理 作为索引,变为“2”(索引为3的值)

就你而言:

INSERT INTO test
VALUES ('2'), ('3'), ('1');
“2”的索引值为2,“3”的索引值为3,“1”的索引值为1。
所以输出是
2,3,1

好的,为了让我的观点更清楚,我调整了样本值。如果使用“a”、“b”和“c”作为枚举值,则会出现相同的问题。我知道枚举的值是根据定义中的顺序排序的。这正是我首先添加CONCAT的原因。你能检查一下服务器和数据库的字符集吗。因为它对我很管用。这是一个问题,看起来只有在使用UTF8_-bin时才会出现问题。我尝试用UTF8\u bin创建表,然后用UTF8\u general\u ci进行排序,效果很好。这是目前我倾向于认为这是一个MySQL错误,正如你所说。如果我在接下来的几天里没有得到另一个解释,我会尝试将它作为一个bug报告。只是一个小信息:我目前正在使用MariaDB 10.3.11,这个bug在那里无法复制。
mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1       |
| 2       |
| 2       |
+---------+
INSERT INTO test
VALUES ('2'), ('3'), ('1');