操做的表:spa
select * from test_max_min;排序
+----+----------+-------------------+字符串
| id | area | best_history_data |test
+----+----------+-------------------+select
| 1 | beijing | 33 |history
| 2 | beijing | 22 |co
| 3 | shanghai | 18 |字符
| 4 | shanghai | 2 |数字
| 5 | chengdu | 1 |data
| 6 | chengdu | 2 |
| 7 | henan | 13 |
| 8 | henan | 12 |
+----+----------+-------------------+
其中,表结构以下:
desc test_max_min;
+-------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | 0 | |
| area | varchar(45) | NO | | NULL | |
| best_history_data | varchar(45) | YES | | NULL | |
+-------------------+-------------+------+-----+---------+-------+
期待:将best_history_data按照顺序排序
可是,直接执行select * from test_max_min order by best_history_data;获取到的结果以下:
+----+----------+-------------------+
| id | area | best_history_data |
+----+----------+-------------------+
| 5 | chengdu | 1 |
| 8 | henan | 12 |
| 7 | henan | 13 |
| 3 | shanghai | 18 |
| 4 | shanghai | 2 |
| 6 | chengdu | 2 |
| 2 | beijing | 22 |
| 1 | beijing | 33 |
+----+----------+-------------------+
能够看出,best_history_data的排序中2在18的后边,不符合咱们的预期。。。缘由是best_history_data是字符串类型的数字,字符串比较大小是逐位从高位到低位逐个比较,因此字符串类型的数字18<2
如何解决:使用+0便可
select * from test_max_min order by best_history_data+0;
+----+----------+-------------------+
| id | area | best_history_data |
+----+----------+-------------------+
| 5 | chengdu | 1 |
| 4 | shanghai | 2 |
| 6 | chengdu | 2 |
| 8 | henan | 12 |
| 7 | henan | 13 |
| 3 | shanghai | 18 |
| 2 | beijing | 22 |
| 1 | beijing | 33 |
+----+----------+-------------------+