Mysql的varchar排序按照数字顺序

本身建表的时候,把一个字段类型建立为varchar(2) ,其实应该建为int(2)的。由于我只容许输出数字。这原本也没什么,无非就是占点空间,懒得改了。可是今天在后台发现排序有问题。因而,没办法,改之。下面简单说一下MySQL的varchar排序问题,引觉得戒。mysql

下面,我从数据库里面以server_id排一下序,你们来看一下排序后的结果:sql

select server_id  from cardserver  where game_id  =  1  order by server_id  desc  limit  10 ;
+-----------+
|
 server_id |
+-----------+
|
 8         | 
| 7         | 
| 6         | 
| 5         | 
| 4         | 
| 3         | 
| 2         | 
| 10        | 
| 1         | 
+-----------+

 

很明显,我想要的结果应该是 10,8,7,6,5 这样的。可是这个10排在了2的后面。按照字符串来排的。其实我是想把它当作数值来排。数据库

手动转换类型:函数

用下面的方法就能够了,使server_id+0以后再排序,问题解决了。spa

select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10;.net

+-----------+
|
 server_id |
+-----------+
|
 10        | 
| 8         | 
| 7         | 
| 6         | 
| 5         | 
| 4         | 
| 3         | 
| 2         | 
| 1         | 
+-----------+
code

 

使用MySQL函数CAST/CONVERT:server

mysql为咱们提供了两个类型转换函数:CAST和CONVERT,现成的东西咱们怎能放过?排序

CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另外一个类型的值。
这个类型 能够是如下值其中的 一个:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]字符串

因此咱们也能够用CAST解决问题:

select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10;

也能够使用CONVERT来搞定此问题:

select server_id  from cardserver  where game_id  =  1  order by  CONVERT (server_id , SIGNED )  desc  limit  10 ;