我有一张table 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,顺序是不正确的:string 5
在前面 2
.
000000000000000000000000000000000005
000000000000000000000000000000000002
问:这种行为的原因是什么?是虫子吗?如何修复?
我的table是这样的:
mysql> describe my_table;
+----------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------------------+--------------+------+-----+---------+-------+
| id | varchar(255) | NO | PRI | NULL | |
| test | varchar(255) | NO | UNI | NULL | |
+----------------------------+--------------+------+-----+---------+-------+
我正在使用MySQL5.7.15
3条答案
按热度按时间kzmpq1sx1#
这是高度可重复性和相当好奇。例如,这会产生错误的排序:
有趣的是
DESC
似乎解决了问题,但是ASC
不。通常,在这种情况下,您希望首先是数字,然后是所有文本。您的版本将把非数字与相同长度的数字穿插在一起。
我建议使用单独的表达式:
这种排序似乎确实有效。
eufgjt7s2#
您使用的是按顺序排列的字符串,因此它不会以不同的方式考虑数字和字符串。例如你有11,12,01,03,你会得到
01 11 12 03只有这样
csbfibhn3#
似乎在21个字符之后,右边的子字符串加上字符串填充就不起作用了。。但是您可以使用简单的lpad来完成这项工作,也可以用于100或更多