Mysql中varchar类型数字排序不对踩坑记录

场景

在进行表设计时将版本号字段设计了为varchar类型,尽量从表设计阶段将数字类型列设计为int型。

再进行排序时如果版本号累计到了10及以上,那么再进行排序时则会出现问题。

比如下面执行排序时发现10被排在了第一位。

这是因为

varchar类型对数字进行排序,是从第一位开始每一位依次比较来进行排序的

会按照字符的字典顺序进行,而不是数值大小。例如,10会被排在2之前,因为在字符串比较中,1大于2。

解决方法:

为了正确地按照数值大小排序,可以使用CAST或CONVERT函数,将VARCHAR类型转换为数值类型

复制代码
select * from bus_app_version ORDER BY CONVERT(app_version, SIGNED)

这里使用了一个函数CONVERT(score,SIGNED),实现的功能是把score字段转化为int类型再进行排序

或者直接将varchar类型进行修改。

相关推荐
@老蝴6 分钟前
MySQL - 索引
数据库·mysql
tgethe15 分钟前
MySQL 进阶攻略
数据库·mysql
亮子AI18 分钟前
【node.js MySQL】node.js 如何连接 MySQL?
数据库·mysql·node.js
程序员根根20 分钟前
Web 开发必学:Java 数据库操作从 JDBC 到 MyBatis 的进阶之路
数据库·后端
全栈工程师修炼指南21 分钟前
Nginx | HTTPS 加密传输:Nginx 反向代理与上游服务 SSL 双向认证实践
网络·数据库·nginx·https·ssl
德迅云安全-小潘22 分钟前
网络空间资产安全发展演进与实践框架
数据库·web安全
极限实验室24 分钟前
APM(二):监控 Python 服务
数据库
川川菜鸟31 分钟前
谷歌安全告警(Chrome 红页)完整处理指南
数据库·chrome·安全
Albert Edison34 分钟前
【MySQL】用户管理
mysql·adb
DemonAvenger1 小时前
Redis缓存穿透、击穿与雪崩:从问题剖析到实战解决方案
数据库·redis·性能优化