sql varchar排序CAST/CONVERT实现语句

小明SEO博客 小明SEO博客,新时代SEO博客

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

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

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

  1. showcreatetablecardserverG
  2. ***************************1.row***************************
  3. Table:cardserver
  4. CreateTable:CREATETABLE`cardserver`(
  5. `id`int(11)NOTNULLdefault'0',
  6. `ver`int(11)defaultNULL,
  7. `createtime`datetimedefaultNULL,
  8. `updatetime`datetimedefaultNULL,
  9. `game_id`int(2)NOTNULLdefault'0',
  10. `server_id`varchar(2)NOTNULLdefault'',
  11. `server_name`varchar(40)NOTNULLdefault'',
  12. PRIMARYKEY(`id`),
  13. UNIQUEKEY`game_id_server_id`(`game_id`,`server_id`),
  14. UNIQUEKEY`game_id_server_name`(`game_id`,`server_name`)
  15. )ENGINE=InnoDBDEFAULTCHARSET=gbk
  16. --phpfensi.com
  17. 1rowinset(0.00sec)

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

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

  1. selectserver_idfromcardserverwheregame_id=1orderbyserver_iddesclimit10;
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |8|
  6. |7|
  7. |6|
  8. |5|
  9. |4|
  10. |3|
  11. |2|
  12. |10|
  13. |1|
  14. +-----------+

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

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

  1. selectserver_idfromcardserverwheregame_id=1orderbyserver_id+0desclimit10;
  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. selectserver_idfromcardserverwheregame_id=1orderbyCAST(server_idasSIGNED)desclimit10;
  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. selectserver_idfromcardserverwheregame_id=1orderbyCONVERT(server_id,SIGNED)desclimit10;
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |10|
  6. |8|
  7. |7|
  8. |6|
  9. |5|
  10. |4|
  11. |3|
  12. |2|
  13. |1|
  14. +-----------+

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

相关广告
  • sql varchar排序CAST/CONVERT实现语句 sql varchar排序CAST/CONVERT实现语句 sql varchar排序CAST/CONVERT实现语句
相关阅读

sql varchar排序CAST/CONVERT实现语句

2019/10/10 17:33:30 | 谷歌SEO算法 | 手机网站制作