sql varchar排序CAST/CONVERT实现语句
发布:smiling 来源: PHP粉丝网 添加日期:2014-10-13 14:13:03 浏览: 评论:0
文章介绍了在自己利用普通排序对数据进行排序时发现varchar字符串排序无法得到我们想要的结果,下面我们来介绍利用 case或convert来解决这个问题.
是今天在后台发现排序有问题,于是,没办法,改之,下面简单说一下MySQL的varchar排序问题,引以为戒.
示例表结构,先来看一下,我的表结构:
- show create table cardserver G
- *************************** 1. row ***************************
- Table: cardserver
- Create Table: CREATE TABLE `cardserver` (
- `id` int(11) NOT NULL default '0',
- `ver` int(11) default NULL,
- `createtime` datetime default NULL,
- `updatetime` datetime default NULL,
- `game_id` int(2) NOT NULL default '0',
- `server_id` varchar(2) NOT NULL default '',
- `server_name` varchar(40) NOT NULL default '',
- PRIMARY KEY (`id`),
- UNIQUE KEY `game_id_server_id` (`game_id`,`server_id`),
- UNIQUE KEY `game_id_server_name` (`game_id`,`server_name`)
- ) ENGINE=InnoDB DEFAULT CHARSET=gbk
- --phpfensi.com
- 1 row in set (0.00 sec)
因为有外键的存在,所以我不想改变字段类型,费劲啊,呵呵,虽然最后我还是选择了更改字段类型,这是后话,因为我本篇日志想要说明的是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;
- +-----------+
- | server_id |
- +-----------+
- | 10 |
- | 8 |
- | 7 |
- | 6 |
- | 5 |
- | 4 |
- | 3 |
- | 2 |
- | 1 |
- +-----------+
也可以使用CONVERT来搞定此问题,代码如下:
- select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10;
- +-----------+
- | server_id |
- +-----------+
- | 10 |
- | 8 |
- | 7 |
- | 6 |
- | 5 |
- | 4 |
- | 3 |
- | 2 |
- | 1 |
- +-----------+
总结:方法有很多要看自己动脑子了,所谓的条条大道通罗马也是这个意思了.
Tags: varchar CAST CONVERT语句
相关文章
- ·mysql中innodb utf8字符集varchar索引长度问题(2014-09-27)
- ·MySQL下varchar类型最大长度是多少(2014-09-28)
- ·mysql中int和varchar的长度详解(2014-09-29)
- ·MySql中varchar,char类型排序CAST CONVERT(2014-10-02)
- ·mysql中text与varchar与char的区别(2014-10-07)
- ·MySQL数据库中CHAR与VARCHAR区别介绍(2014-10-11)
- ·MySql varchar排序 CAST ,CONVERT及用法(2014-10-12)
- ·mysql中char、varchar、nvarchar数据类型的用法区别(2014-10-12)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)