`

MySQL varchar类型字段排序问题

阅读更多

转自:http://www.xiaoxiaozi.com/2009/11/04/1605/

废话不多说了,自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为integer(2)的。因为我只允许输出数字。这本来也没什么,无非就是占点空间,懒得改了。

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

示例表结构:

先来看一下,我的表结构

show create table cardserver \G
*************************** 1. row ***************************
       Table: cardserver
Create TableCREATE 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)

因为有外键的存在,所以我不想改变字段类型,费劲啊。呵呵。虽然最后我还是选择了更改字段类型,这是后话。因为我本篇日志想要说明的是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         | 
+-----------+

总结:

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

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

分享到:
评论

相关推荐

    MySQL中Order By多字段排序规则代码示例

    突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧。 MySql order by 单字段 建一测试表如下: CREATE TABLE `a` ( `code` varchar(255) DEFAULT NULL, `name` ...

    MySQL关于字符串中数字排序的问题分析

    今天解决了一个关于MySQL字符串排序的很奇怪的问题,在数据里面定义的是varchar类型,实际存放的是Int类型的数据,按一下查询语句进行排序: 将字段*1或者+0可以将MySQL字符串字段按数值排序 如: select * from table ...

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    144790个去重/未去重的按连续/不连续ID排序的单词、注音、释义、例句表(MySQL,可直接加载导入数据库,注音单独成字段)

    MySQL表的字段如下所示: Field Type Null Key Default Extra id int unsigned NO PRI NULL auto_increment word varchar(50) NO NULL pronunciation varchar(100) YES NULL meaning varchar(500) NO NULL ...

    MySql 5.1 参考手册.chm

    前言 1. 一般信息 1.1. 关于本手册 ...11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型

    Mysql排序和分页(order by&limit)及存在的坑

    排序查询(order by) 电商中:我们想查看今天所有成交的订单,按照交易额从高到低排序,此时我们可以使用数据库中的排序功能来完成。...mysql> create table test2(a int,b varchar(10)); Query OK, 0 rows

    MySQL数据库命名规范及约定

    一、【操作规范】1. 如无备注,则表中的第一个...7. 针对varchar类型字段的程序处理,请验证用户输入,不要超出其预设的长度;8. 建表时将数据字典中的字段中文名和属性备注写入数据表的备注中(“PK、自动增长”不用写

    MYSQL

    7.3.6.3 TIME类型 7.3.6.4 YEAR类型 7.3.7 字符串类型 7.3.7.1 CHAR和VARCHAR类型 7.3.7.2 BLOB和TEXT类型 7.3.7.3 ENUM类型 7.3.7.4 SET类型 7.3.8 为列选择正确的类型 7.3.9 ...

    MySQL中文参考手册.chm

    7.3.6.2 DATETIME,DATE和TIMESTAMP类型 7.3.6.3 TIME类型 7.3.6.4 YEAR类型 7.3.7 字符串类型 7.3.7.1 CHAR和VARCHAR类型 7.3.7.2 BLOB和TEXT类型 7.3.7.3 ENUM类型 7.3.7.4...

    MySQL中文参考手册

    * 0 译者序 * 1 MySQL的一般的信息 ... # 7.3.7.1 CHAR和VARCHAR类型 # 7.3.7.2 BLOB和TEXT类型 # 7.3.7.3 ENUM类型 # 7.3.7.4 SET类型 + 7.3.8 为列选择正确的类型 + 7.3.9 列索引 + 7.3.10 多列索引 +...

    MYSQL常用命令大全

    命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]); mysql> create table MyClass( > id int(4) not null primary key auto_increment, > name char(20) not null, > sex int(4) not null ...

    MySQL 5.1中文手冊

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. ...

    MySQL 5.1官方简体中文参考手册

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. ...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

    MySQL 5.1参考手册

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. ...

    MySQL 5.1参考手册中文版

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 ...

    MySQL 5.1参考手册 (中文版)

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. ...

    mysql5.1中文手册

    CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的...

    MySQL命令大全

    命令:create table <表名> ( <字段名> <类型> [,..<字段名n> <类型n>]); mysql> create table MyClass( > id int(4) not null primary key auto_increment, > name char(20) not null, > sex int(4) not null ...

    MYSQL中文手册

    11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 ...

Global site tag (gtag.js) - Google Analytics