Mysql的varchar排序按照数字顺序

转载 2016年06月02日 09:56:48

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

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

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之后再排序,问题解决了。

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

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

 

使用MySQL函数CAST/CONVERT:

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;
举报

相关文章推荐

Mysql的varchar排序按照数字顺序

自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为int(2)的。因为我只允许输出数字。这本来也没什么,无非就是占点空间,懒得改了。但是今天在后台发现排序有问题。于是,没办法,改...

Mysql按数字大小排序String字段

Mysql按数字大小排序String字段标题有点难以理解,事实是我不知道怎样用一句话来描述此种情形。问题是这样的,当我们按由大到小的顺序排序一组数字的时候,它应该如此:98008000900但如果是这...
  • imzkz
  • imzkz
  • 2010-06-23 11:12
  • 14671

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

mysql字符串数值按数值排序问题

内容参考:http://blog.csdn.net/kemy88/archive/ 特此感谢   在实际操作时发现使用字符型的数值进行排序输出时出现了,2排在所有第一个字符为1的数字的后面 sq...

mysql 对varchar型数字排序

字段pageNum 1,6,9,11   希望排序顺序为1,6,9,11 但是实际排序为1,11,6,9   后来发现是因为pageNum这个字段是varchar类型的不是int型,所以排...

varchar类型的字段存储纯数字的排序

如果表字段的类型为varchar型,但是里面存储的是纯数字,怎么实现按照数字的大小来排序? 下面的方法对于mysql和oracle都实用 order by 字段+0 order by 字段*1 ...

排序字段不要用varchar类型

排序字段使用 number 类型

mysql 查询varchar类型字段排序

首先,如果里面存的是字母,会按英文字母顺序排序,如果含有数字,按数字大小排序,如果含有汉字,按照所选择的汉字编码排序。 一般情况下,int类型的字段可以直接使用max()函数查询出某一列...

MySQL中字段varchar和int排序的区别

首先我们建立一个简单的数据表,这个表只有两个字段,ID和a,a字段的类型是int类型。 我先的需求是对a字段进行正序排列SELECT * FROM `test` ORDER BY `a` ASC...

SQL字符型字段按数字型字段排序实现方法

得分字段为varchar 那么按得分排序得到的结果可能是: 1 10 11 123 1234 2 25 253 3 但是我们想要按照数字排序 1 2 3 10 11 ...

mysql进阶(八)怎么对varchar类型排序问题

MySQL中怎么对varchar类型排序问题 asc 升级 desc降序 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)