转自:http://www.xiaoxiaozi.com/2009/11/04/1605/
废话不多说了,自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为integer(2)的。因为我只允许输出数字。这本来也没什么,无非就是占点空间,懒得改了。
但是今天在后台发现排序有问题。于是,没办法,改之。下面简单说一下MySQL的varchar排序问题,引以为戒。
示例表结构:
先来看一下,我的表结构
*************************** 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)
因为有外键的存在,所以我不想改变字段类型,费劲啊。呵呵。虽然最后我还是选择了更改字段类型,这是后话。因为我本篇日志想要说明的是varchar排序问题。所以不再说明我是如何更改字段类型的,大家有兴趣可以搜索我以前的日志。(骗一下点击)
现象描述:
下面,我从数据库里面以server_id排一下序,大家来看一下排序后的结果:
+-----------+
| server_id |
+-----------+
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 10 |
| 1 |
+-----------+
很明显,我想要的结果应该是 10,8,7,6,5 这样的。但是这个10排在了2的后面。按照字符串来排的。其实我是想把它当做数值来排。
手动转换类型:
用下面的方法就可以了,使server_id+0之后再排序,问题解决了。
+-----------+
| 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解决问题:
+-----------+
| server_id |
+-----------+
| 10 |
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
+-----------+
也可以使用CONVERT来搞定此问题:
+-----------+
| server_id |
+-----------+
| 10 |
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
+-----------+
总结:
条条大道通罗马,条条小路通我家。不管是啥方法,解决问题就是好方法。当然,既然MySQL为我们提供了现成的函数。我们为何不让代码显得更漂亮些呢?呵呵。
所以MySql varchar排序我推荐使用CAST或CONVERT函数。
相关推荐
在MySQL数据库中,经常遇到需要将存储日期信息的VARCHAR字段转换为DATE类型的情况。这是因为VARCHAR类型通常用于存储非结构化的文本数据,而DATE类型则更适合处理日期和时间的数据。在处理涉及日期计算或比较的查询...
总结来说,MySQL的`ORDER BY`语句允许对查询结果进行多字段排序,先按照第一个字段排序,如有重复值,则按照后续字段继续排序。理解这一点对于优化SQL查询和确保数据按预期排列至关重要。在实际应用中,应根据具体...
还有关于SQL多条件多字段排序、根据数字型字段对字符型字段排序、基于经纬度的距离排序、以及MySQL的排序规则utf8_unicode_ci和utf8_general_ci的区别,这些都是数据库管理和查询优化中非常重要的知识点。...
本文将深入探讨在将`int`类型转换为`varchar`类型后导致的慢查询问题,并提供相关优化建议。 首先,让我们看下问题的根源。在给出的表`appstat_day_prototype_201305`中,`appkey`字段被定义为`varchar(20)`,而`...
在处理可能包含非数字字符的varchar字段时,需要注意转换可能会抛出错误。因此,转换前最好先确保数据的合法性,例如使用`TRY_CAST`或`IFNULL`来处理可能的异常。 在转换varchar到int的过程中,还要注意数据溢出的...
### MySQL常见面试问题详解 #### 1. MySQL简介与特性 - **MySQL**:MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前由Oracle公司维护。它以其高性能、高可靠性和易用性著称,在互联网行业...
`:将`bulletin`表中的`uid`字段改名为`username`,并将其数据类型改为`VARCHAR(50)`,非空且默认值为空字符串。 3. **添加字段**: - `ALTER TABLE bulletin add citycode varchar(6) not null default 0;`:向`...
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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数据库中遇到中文乱码问题,通常可以归结为以下几个方面: 1. **Server本身的设定问题**:比如服务器使用的字符集仍停留在老旧的`latin1`而非...
这个命令会更改`test`表中名为`name`的字段的字符集为`utf8`,同时保持其VARCHAR类型和非空约束不变。如果字段已有数据,记得先备份,因为修改字符集可能会影响数据的表示。 在执行这些操作之前,确保你理解表和...
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数据库编码问题涉及到字符集的选择、配置以及数据的迁移和处理。字符集是决定数据库中存储和检索文本数据的方式,对于多语言支持和数据迁移至关重要。UTF-8是一种广泛使用的多字节字符编码,支持全球大部分语言...
通达OA2013自动化办公系统的MYSQL数据库字段文档中,包含了多个表的字段信息,以下是对这些字段的详解: ### address 表 address 表用于存储通讯簿信息,字段信息如下: * ADD_ID:自增唯一 ID,int(11)类型 * ...
例如,对于经常进行排序和搜索的字段,使用整数类型可能会更快;对于存储大量文本的字段,TEXT和BLOB类型更为合适;而对于时间记录,DATE、TIME和TIMESTAMP各有优势,其中TIMESTAMP在插入或更新时会自动设置为当前...
Presto SQL 和 MySQL SQL 都支持隐式类型转换,但 Presto SQL 不会隐式转换类型,而 MySQL SQL 会隐式转换类型。例如,在 MySQL SQL 中,`where` 条件中的字符串类型可以隐式转换为数字类型,但这可能会造成索引不起...
本文将详细介绍如何在 MySQL 中创建一个自定义函数 `sfn_GetSimilar_Rate` 来计算两个中文字符串的相似度,并基于此相似度进行排序。 #### 函数设计与实现 本节将详细介绍 `sfn_GetSimilar_Rate` 函数的设计与实现...
总之,要解决MySQL中的中文排序问题,关键在于选择正确的字符集和校对规则,并在查询时使用`CONVERT`函数转换字符集进行排序。确保整个系统(包括数据库、表、字段、客户端和查询)的字符集设置一致,才能实现准确的...
前言 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. 选择正确的列类型