MySQL数字排序为什么乱

最近排查一个 PHP 后台时遇到过这种情况:页面按"金额从大到小"排序,结果却出现了 99 排在 1000 前面、800 排在 90 后面的情况。PHP 接口没有报错,SQL 里的 ORDER BY amount DESC 也写得没问题。

继续看表结构后才发现,amount 字段当初为了兼容导入数据,被定义成了 VARCHAR。

MySQL 对字符串排序时比较的是字符顺序,而不是数值大小。比如 "99" 和 "1000" 比较时,会先比较第一个字符,9 自然会排在 1 前面,所以结果看起来就像"排序失效"。

临时处理可以在 SQL 里使用 CAST(amount AS DECIMAL) 转成数值后再排序,但这样做在数据量大时可能影响索引使用,查询性能也会下降。

后来把数据先清洗一遍,将金额字段正式改成 DECIMAL 类型。像数量、金额、重量、积分这类需要计算和排序的数据,也统一按照实际用途设计字段类型,不再为了"方便存任何内容"全部使用字符串。

现在遇到排序结果异常,我一般除了检查 ORDER BY,还会先确认字段类型。

数据库字段能存进去,并不代表类型设计就是合理的。很多查询、统计和索引问题,最后都和最开始的字段类型选择有关。

#PHP开发 #MySQL #数据库设计 #数据排序

相关推荐
不停喝水2 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
leisoo80973 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
Aric_Jones3 小时前
pgsql内置publication/subscription功能,实现数据同步
数据库
有想法的py工程师3 小时前
PostgreSQL 字符集双重转义击穿 磁盘 I/O
数据库·postgresql
头发还在的女程序员3 小时前
【无标题】
网络·数据库·短剧小程序·短剧系统·海外短剧·短剧后台
千千寰宇3 小时前
[数据库系统] 数据库系统的设计原理研究
数据结构·数据库·database-opengemini/influxdb·database-dament/达梦
麦壳饼3 小时前
SonnetDB SQL 分页查询:LIMIT/OFFSET 与 FETCH 语法
数据库·sonnetdb
Gauss松鼠会3 小时前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结