`

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中把varchar类型转为date类型方法详解

    在MySQL数据库中,经常遇到需要将存储日期信息的VARCHAR字段转换为DATE类型的情况。这是因为VARCHAR类型通常用于存储非结构化的文本数据,而DATE类型则更适合处理日期和时间的数据。在处理涉及日期计算或比较的查询...

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

    总结来说,MySQL的`ORDER BY`语句允许对查询结果进行多字段排序,先按照第一个字段排序,如有重复值,则按照后续字段继续排序。理解这一点对于优化SQL查询和确保数据按预期排列至关重要。在实际应用中,应根据具体...

    sqlserver中将varchar类型转换为int型再进行排序的方法

    还有关于SQL多条件多字段排序、根据数字型字段对字符型字段排序、基于经纬度的距离排序、以及MySQL的排序规则utf8_unicode_ci和utf8_general_ci的区别,这些都是数据库管理和查询优化中非常重要的知识点。...

    MySQL数据库中把int转化varchar引发的慢查询

    本文将深入探讨在将`int`类型转换为`varchar`类型后导致的慢查询问题,并提供相关优化建议。 首先,让我们看下问题的根源。在给出的表`appstat_day_prototype_201305`中,`appkey`字段被定义为`varchar(20)`,而`...

    Mysql数据库中把varchar类型转化为int类型的方法

    在处理可能包含非数字字符的varchar字段时,需要注意转换可能会抛出错误。因此,转换前最好先确保数据的合法性,例如使用`TRY_CAST`或`IFNULL`来处理可能的异常。 在转换varchar到int的过程中,还要注意数据溢出的...

    mysql问题,常见的mysql面试问题

    ### MySQL常见面试问题详解 #### 1. MySQL简介与特性 - **MySQL**:MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前由Oracle公司维护。它以其高性能、高可靠性和易用性著称,在互联网行业...

    MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结

    `:将`bulletin`表中的`uid`字段改名为`username`,并将其数据类型改为`VARCHAR(50)`,非空且默认值为空字符串。 3. **添加字段**: - `ALTER TABLE bulletin add citycode varchar(6) not null default 0;`:向`...

    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 ...

    mysql乱码问题解决

    ### MySQL中文乱码问题解析与解决方案 #### 一、乱码原因分析 在MySQL数据库中遇到中文乱码问题,通常可以归结为以下几个方面: 1. **Server本身的设定问题**:比如服务器使用的字符集仍停留在老旧的`latin1`而非...

    修改MySQL数据库中表和表中字段的编码方式的方法

    这个命令会更改`test`表中名为`name`的字段的字符集为`utf8`,同时保持其VARCHAR类型和非空约束不变。如果字段已有数据,记得先备份,因为修改字符集可能会影响数据的表示。 在执行这些操作之前,确保你理解表和...

    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数据库编码问题 (修改数据库,表,字段编码为utf8)

    MySQL数据库编码问题涉及到字符集的选择、配置以及数据的迁移和处理。字符集是决定数据库中存储和检索文本数据的方式,对于多语言支持和数据迁移至关重要。UTF-8是一种广泛使用的多字节字符编码,支持全球大部分语言...

    通达OA2013数据库字典(含全部字段注释)20130706.docx

    通达OA2013自动化办公系统的MYSQL数据库字段文档中,包含了多个表的字段信息,以下是对这些字段的详解: ### address 表 address 表用于存储通讯簿信息,字段信息如下: * ADD_ID:自增唯一 ID,int(11)类型 * ...

    MySQL数据类型

    例如,对于经常进行排序和搜索的字段,使用整数类型可能会更快;对于存储大量文本的字段,TEXT和BLOB类型更为合适;而对于时间记录,DATE、TIME和TIMESTAMP各有优势,其中TIMESTAMP在插入或更新时会自动设置为当前...

    presto sql 与mysql sql 对比.pdf

    Presto SQL 和 MySQL SQL 都支持隐式类型转换,但 Presto SQL 不会隐式转换类型,而 MySQL SQL 会隐式转换类型。例如,在 MySQL SQL 中,`where` 条件中的字符串类型可以隐式转换为数字类型,但这可能会造成索引不起...

    mysql 计算字符串相似度

    本文将详细介绍如何在 MySQL 中创建一个自定义函数 `sfn_GetSimilar_Rate` 来计算两个中文字符串的相似度,并基于此相似度进行排序。 #### 函数设计与实现 本节将详细介绍 `sfn_GetSimilar_Rate` 函数的设计与实现...

    mysql如何按照中文排序解决方案

    总之,要解决MySQL中的中文排序问题,关键在于选择正确的字符集和校对规则,并在查询时使用`CONVERT`函数转换字符集进行排序。确保整个系统(包括数据库、表、字段、客户端和查询)的字符集设置一致,才能实现准确的...

    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. 选择正确的列类型

Global site tag (gtag.js) - Google Analytics