mysql数值字符串类型的按照数值进行排序

今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动的识别出这些数据是数值,百度了一下,发现对于这种情况,可以采用 

1
2
3
order by 字段名称+0 desc/asc的形式进行排序(亲测有效)
 
order by 字段名称*1 desc/asc的形式进行排序( 没有进行测试 )

  ----这样mysql会将数值字符串类型的数据当作数值进行处理,但是存在效率问题,不推荐使用varchar/char类型来存储数值,这样会带来不不必要的问题.

   注:

   在项目中,有一个字段是有可能是字符串也有可能是数字,但如果是数字,需要按照大小排序,所以就找到了上述的博文,亲测可用,如下:博主的第二种方式也是可以的,测试通过


举一个版本号数据作为例子:

create table `temp_app_info` (
`id` double ,
`os` varchar (150)
); 
insert into `temp_app_info` (`id`, `os`) values('1','1.1');
insert into `temp_app_info` (`id`, `os`) values('2','1.2');
insert into `temp_app_info` (`id`, `os`) values('3','1.1.1');
insert into `temp_app_info` (`id`, `os`) values('4','1.2.1');
insert into `temp_app_info` (`id`, `os`) values('5','1.1.2');
insert into `temp_app_info` (`id`, `os`) values('6','1.3');
insert into `temp_app_info` (`id`, `os`) values('7','1.11');
insert into `temp_app_info` (`id`, `os`) values('8','10.1');
insert into `temp_app_info` (`id`, `os`) values('9','2.1');


比较以下两种排序:

SELECT * FROM temp_app_info a ORDER BY a.os ASC;
SELECT * FROM temp_app_info a ORDER BY a.os+0 ASC;

在通过范围查询时也可能会遇到排序问题,也可以通过

SELECT * FROM temp_app_info a WHERE a.os >= '1.12'+0 AND a.os <= '2.1'+0;

方式进行排序