初始数据:
<!-- 建表语句 -->
CREATE TABLE `test` (
`id` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
<!-- 初始数据 -->
INSERT INTO `test` VALUES ('10A');
INSERT INTO `test` VALUES ('1A');
INSERT INTO `test` VALUES ('2B');
INSERT INTO `test` VALUES ('3A');
INSERT INTO `test` VALUES ('3C');
INSERT INTO `test` VALUES ('A10');
字典排序结果:
SELECT id FROM `test` ORDER BY id;
# 结果展示
id
10A
1A
2B
3A
3C
A10
自然排序结果:
方式一:使用LPAD函数,
最推荐
的方式。
LPAD函数:从目标字符串的左边开始用指定的字符串填充至指定长度。
SELECT id, LPAD(id, 4, '0')as lpad FROM `test` ORDER BY LPAD(id, 4, '0');
# 结果展示
id lpad
1A 001A
2B 002B
3A 003A
3C 003C
10A 010A
A10 0A10
## 实际开发中可以用空格字符串去填充,如下所示:
## SELECT id, LPAD(id, 4, ' ')as lpad FROM `test` ORDER BY LPAD(id, 4, ' ');
方式二:使用Length函数,也还可以。
Length函数:返回字符串str的长度。
SELECT id, LENGTH(id)as lpad FROM `test` ORDER BY LENGTH(id);
# 结果展示
id lpad
1A 2
2B 2
3A 2
3C 2
10A 3
A10 3
方式三:这种方式其实是
有问题
的,但是在网上也经常出现,特定情况下满足,反例如下:
SELECT id FROM `test` ORDER BY CAST(id AS UNSIGNED);
# 结果展示
id
A10
1A
2B
3A
3C
10A