mysql中如何用varchar字符串按照数字排序
作者:ElenaYu
这篇文章主要介绍了mysql中用varchar字符串按照数字排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
mysql用varchar字符串按照数字排序
问题
对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动的识别出这些数据是数值。
如:
L1,L2,L3…L10,L11排序,按照常规的 desc/asc 进行排序,结果为:L1,L10,L11,L2,L3…table:
执行sql:
select * from test order by score asc;
结果为:
期望:按照L1,L2,L3…L10,L11…的顺序排序
解决
方法1:
select * from test order by score-0 asc;
方法2:
select * from test order by cast(score as signed ) asc;
方法3:
select * from test order by convert(score,signed) asc;
方法4(亲测有效):
select * from test order by substr(score from 2)-0 asc;
以上方法,查询结果为:
问题解决!
mysql按数值大小排序varchar字段
select * from table_name where 1 order by meta_value DESC; 一般用法,当排序varchar类型的数字内容时就会出现问题; select * from table_name where 1 order by --meta_value DESC; 这样就会按照数字的大小排序了。
问题是这样的,当我们按由大到小的顺序排序一组数字的时候,
它应该如此:
- 9800
- 8000
- 900
但如果是这些数字是以varchar类型存储的话,
直接排序的结果会是这样:
- 9800
- 900
- 8000
解决方案1:
当然多数情况下我们会把数字存储为数字型,就可避免这一问题。但还是有一些情形,数字被存储为varchar。
解决方案2:
-
meta_value ASC 。
此时采用的是按meta_value的负值排序,所以如需得到由大到小的效果,需要使用ASC而非DESC。
当然也可以直接用
--meta_value DESC
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。