MySQL 列设置为 varchar(255) 排序中的问题
Posted
技术标签:
【中文标题】MySQL 列设置为 varchar(255) 排序中的问题【英文标题】:MySQL problem in the sorting of column set as varchar(255) 【发布时间】:2021-07-11 16:07:51 【问题描述】:我无法将字段sID_contents_p
设置为VARCHAR (255)
从表ttt
中存储一个数据库mysql version 8.0.17
这是 db-fiddle.com 上的结果,它提供 MySQL 8
我需要这个返回,例如当sID_contents_p
包含 1 时
+----------------+-----+
| sID_contents_p | sID |
+----------------+-----+
| 1.1 | 1 |
| 1.2 | 2 |
| 1.3 | 3 |
| 1.4 | 4 |
| 1.5 | 5 |
| 1.6 | 6 |
| 1.7 | 7 |
| 1.8 | 8 |
| 1.9 | 9 |
| 1.10 | 10 |
| 1.11 | 11 |
| 1.12 | 12 |
| 1.13 | 13 |
| 1.14 | 14 |
| 1.15 | 15 |
| 1.16 | 16 |
| 1.17 | 17 |
| 1.18 | 18 |
| 1.19 | 19 |
| 1.20 | 89 |
+----------------+-----+
我已经尝试过这个查询,但返回的不是你想要的(见上文)......
mysql> SELECT
sID_contents_p,
sID
FROM
`ttt` WHERE SUBSTRING_INDEX(sID_contents_p,".",1) = 1
ORDER BY
sID_contents_p ASC;
+----------------+-----+
| sID_contents_p | sID |
+----------------+-----+
| 1.1 | 1 |
| 1.10 | 10 |
| 1.11 | 11 |
| 1.12 | 12 |
| 1.13 | 13 |
| 1.14 | 14 |
| 1.15 | 15 |
| 1.16 | 16 |
| 1.17 | 17 |
| 1.18 | 18 |
| 1.19 | 19 |
| 1.2 | 2 |
| 1.20 | 89 |
| 1.3 | 3 |
| 1.4 | 4 |
| 1.5 | 5 |
| 1.6 | 6 |
| 1.7 | 7 |
| 1.8 | 8 |
| 1.9 | 9 |
+----------------+-----+
20 rows in set (0.03 sec)
【问题讨论】:
该列的排序完全符合其应有的要求,因为您不恰当地使用字符串来保存数值。 【参考方案1】:问题在于排序。你有一个字符串。一种方法是先按长度排序:
ORDER BY LENGTH(sID_contents_p), sID_contents_p
编辑:
如果第一个组件的长度也可以变化,则拆分值并转换为整数:
ORDER BY SUBSTRING_INDEX(sID_contents_p, '.', 1) + 0,
SUBSTRING_INDEX(sID_contents_p, '.', -1) + 0
【讨论】:
请注意,如果目标是按第一个数字然后第二个数字排序,那么这种方法可能不起作用,see here。 @TimBiegeleisen 。 . .这是一个好点。我添加了一个替代方案。 LOL so did I ... 看来 OP 今天又问了哈哈。以上是关于MySQL 列设置为 varchar(255) 排序中的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何划分 2 个 VARCHAR(255) 值并插入行(MySQL,Python)
小白学习MySQL - varchar类型字段为什么经常定义成255?
Amazon Redshift - 表列声明为 varchar(max) 但强制为 varchar(255)