mysql中varchar类型存入数字时排序问题

学生成绩表

idnamescore
1小红80
2小蓝50
3马里奥100
4路易150

这张表中,由于某些不可抗力的影响,name和score都是用的varchar类型。
这时有一个需求,需要把所有的学生按照成绩由高到低排序。正常的想法应该是这样来写:

错误的写法
select * from student order by score desc

看上去好像没什么问题,但发现得到的结果为:

idnamescore
1小红80
2小蓝50
4路易150
3马里奥100

并不是我们想要的结果,小红只有80分却排在第一位,是为什么呢。
原因也很简单,varchar类型对数字进行排序,是从第一位开始每一位依次比较来进行排序的。也就是说,四位学生第一位,最大的数字是小红的8,所以小红排在第一位,第二大的是小蓝的5,所以小蓝排第二,路易和马里奥第一位都是1,但路易第二位是5,马里奥的第二位是0,所以路易排在马里奥的前面。

正确的写法

刚解释了普通排序错误的原因,现在说一下正确的写法。

select * from student order by CONVERT(score,SIGNED) desc

这里使用了一个函数CONVERT(score,SIGNED),实现的功能是把score字段转化为int类型再进行排序,这样得到的就是正确的结果了:

idnamescore
4路易150
3马里奥100
1小红80
2小蓝50

可以看到,得到的结果,是按分数由大到小的顺序来进行排序的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值