MySQL 中将 varchar 字段转换成数字进行排序

文章目录

    问题来源于 ecshop 的商品属性列表排序 bug。

    includes/lib_goods.php 中是这样写的

    'ORDER BY a.sort_order, g.attr_price, g.goods_attr_id';
    

    然而 attr_price 字段非常傻逼地使用了 varchar 类型,造成 51 这样的价格会排在 111 后面。

    修复方法是将 attr_price 转换为数字再进行排序, *1 即可

    'ORDER BY a.sort_order, g.attr_price * 1, g.goods_attr_id';
    

    测试了整型、浮点型、为 null (默认转换为0)都可以正常排序。

    注:

    网上的一种做法是,

    order by cast(col as unsigned)
    

    但是,这会把小数位去掉,不合理。还是使用 *1 最佳。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式