Mysql 自然排序

初始数据:
<!-- 建表语句 -->
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值