首页 > 数据库 > MySQL > 正文

sql varchar排序CAST/CONVERT实现语句

2024-07-24 12:38:53
字体:
来源:转载
供稿:网友

文章介绍了在自己利用普通排序对数据进行排序时发现varchar字符串排序无法得到我们想要的结果,下面我们来介绍利用 case或convert来解决这个问题.

是今天在后台发现排序有问题,于是,没办法,改之,下面简单说一下MySQL的varchar排序问题,引以为戒.

示例表结构,先来看一下,我的表结构:

  1. show create table cardserver G 
  2. *************************** 1. row *************************** 
  3.        Table: cardserver 
  4. Create TableCREATE TABLE `cardserver` ( 
  5.   `id` int(11) NOT NULL default '0'
  6.   `ver` int(11) default NULL
  7.   `createtime` datetime default NULL
  8.   `updatetime` datetime default NULL
  9.   `game_id` int(2) NOT NULL default '0'
  10.   `server_id` varchar(2) NOT NULL default ''
  11.   `server_name` varchar(40) NOT NULL default ''
  12.   PRIMARY KEY  (`id`), 
  13.   UNIQUE KEY `game_id_server_id` (`game_id`,`server_id`), 
  14.   UNIQUE KEY `game_id_server_name` (`game_id`,`server_name`) 
  15. ) ENGINE=InnoDB DEFAULT CHARSET=gbk 
  16. --Vevb.com 
  17.  
  18. 1 row in set (0.00 sec) 

因为有外键的存在,所以我不想改变字段类型,费劲啊,呵呵,虽然最后我还是选择了更改字段类型,这是后话,因为我本篇日志想要说明的是varchar排序问题,所以不再说明我是如何更改字段类型的,大家有兴趣可以搜索我以前的日志.

现象描述:下面,我从数据库里面以server_id排一下序,大家来看一下排序后的结果,代码如下:

  1. select server_id from cardserver where game_id = 1 order by server_id desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 8         |  
  6. | 7         |  
  7. | 6         |  
  8. | 5         |  
  9. | 4         |  
  10. | 3         |  
  11. | 2         |  
  12. | 10        |  
  13. | 1         |  
  14.  
  15.  
  16. +-----------+ 

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

手动转换类型:用下面的方法就可以了,使server_id+0之后再排序,问题解决了,代码如下:

  1. select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+  

使用MySQL函数CAST/CONVERT:mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过?

CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值.

这个类型 可以是以下值其中的一个:

  1. BINARY[(N)] 
  2. CHAR[(N)] 
  3. DATE 
  4. DATETIME 
  5. DECIMAL 
  6. SIGNED [INTEGER
  7. TIME 
  8. UNSIGNED [INTEGER

所以我们也可以用CAST解决问题,代码如下:

  1. select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+ 

也可以使用CONVERT来搞定此问题,代码如下:

  1. select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10; 
  2. +-----------+ 
  3. | server_id | 
  4. +-----------+ 
  5. | 10        |  
  6. | 8         |  
  7. | 7         |  
  8. | 6         |  
  9. | 5         |  
  10. | 4         |  
  11. | 3         |  
  12. | 2         |  
  13. | 1         |  
  14. +-----------+  

总结:方法有很多要看自己动脑子了,所谓的条条大道通罗马也是这个意思了.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表