MySQL:ORDER BY使用长字符串生成错误的顺序

时间:2018-04-26 15:25:47

标签: mysql sql sql-order-by mysql-5.7

我有一个VARCHAR(255)列的表格,其中包含以下字符串。

1
2
5
22
text

我需要规范化字符串并对它们进行排序。我在前面添加了0,以便在订购时获得以下信息:

0001
0002
0005
0022
text

以下是查询:

SELECT right(concat('000000000000000000000000000000000000', test), 36)
FROM my_table
ORDER BY right(concat('000000000000000000000000000000000000', test), 36);

如果number_of_chars调用中的right()足够小(比如16),则顺序正确,但如果我使用36,则顺序不正确:字符5出现在{{1}之前}。

2

问题:这种行为的原因是什么?这是一个错误吗?如何解决?

以下是我的表格:

000000000000000000000000000000000005
000000000000000000000000000000000002

我正在使用MySQL 5.7.15

3 个答案:

答案 0 :(得分:2)

似乎在21 char之后,带字符串填充的右子字符串不起作用..但是 你可以使用简单的lpad这项工作也可以100或更多

SELECT test
FROM my_table
ORDER BY lpad(test,100, '0')

答案 1 :(得分:0)

这是高度可重复的,非常好奇。例如,这会产生错误的排序:

SELECT right(concat(repeat('0', 36), test), 36) as val
FROM (select 'abcd' as test union all
      select '5' as test union all
      select '2' as test union all
      select '13' as test union all
      select '10013' as test union all
      select 'def' as test
     ) t
ORDER BY val ;

有趣的是,添加DESC似乎可以解决问题,但ASC却没有。

通常,在这种情况下,您希望数字首先跟随所有文本。您的版本将使用相同长度的数字散布非数字。

我建议使用单独的表达式执行此操作:

ORDER BY (left(test, 1) between '0' and '9') desc,
         test + 0,
         test

这种排序确实有效。

答案 2 :(得分:0)

您按顺序使用字符串,因此不会以不同的方式考虑数字n字符串。例如 你有11,12,01,03, 你会得到

01 11 12 03只是这样