博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql里的varchar值转换为可排序的值(MySql varchar排序 CAST ,CONVERT)
阅读量:4054 次
发布时间:2019-05-25

本文共 2136 字,大约阅读时间需要 7 分钟。

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

下面,我从数据库里面以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        
|
+-----------+

总结:

条条大道通罗马,条条小路通我家。不管是啥方法,解决问题就是好方法。当然,既然MySQL为我们提供了现成的函数。我们为何不让代码显得更漂亮些呢?呵呵。

所以MySql varchar排序我推荐使用CAST或CONVERT函数。

 

转载地址:http://teoci.baihongyu.com/

你可能感兴趣的文章
分布式应用开发相关的面试题收集
查看>>
简单理解Socket及TCP/IP、Http、Socket的区别
查看>>
利用HTTP Cache来优化网站
查看>>
利用负载均衡优化和加速HTTP应用
查看>>
消息队列设计精要
查看>>
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>
SSH原理与运用
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>
《天亮了》韩红
查看>>
Windows CE下USB摄像头驱动开发(以OV511为例,附带全部源代码以及讲解) [转]
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>