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 #数据库设计 #数据排序

相关推荐
ClickHouseDB3 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺4 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw4 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社5 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙5 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
niucloud-admin6 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
ESDWAN6 小时前
企业网络监控应该监测哪些目标?网关、网络节点还是业务系统?
服务器·网络·php
captain3766 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫127 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php