MySql中varchar,char类型排序CAST CONVERT

简单说一下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)

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

数据表某字段client_name的字符编码是utf8_general_ci;

 代码如下 复制代码
SELECT  *  FROM  `client_info_msg`   ORDER BY CONVERT( client_name USING gbk ) COLLATE gbk_chinese_ci ASC;

某字段name的字符编码是latin1_swedish_ci;

Sql代码

 代码如下 复制代码
select  *  from `tbl` order by birary(name) asc

一、1 CREATE TABLE NAME(name VARCHAR(10));

对这个表,缺省情况下,下面两个查询的结果是一样的:

 代码如下 复制代码

SELECT * FROM TABLE NAME WHERE name='clip';

SELECT * FROM TABLE NAME WHERE name='Clip';

MySql默认查询是不区分大小写的,如果需要区分他,必须在建表的时候,Binary标示敏感的属性.

 代码如下 复制代码

CREATE TABLE NAME(

name VARCHAR(10) BINARY

);

2 在SQL语句中实现 SELECT * FROM TABLE NAME WHERE  BINARY name='Clip';

3 设置字符集:

utf8_general_ci –不区分大小写

utf8_bin–区分大小写

二、 MySQL在windows下是不区分大小写的,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出错了。因为在linux下表名区分大小写而找不到表,查了很多都是说在linux下更改MySQL的设 置使其也不区分大小写,但是有没有办法反过来让windows 下大小写敏感呢。其实方法是一样的,相应的更改windows中MySQL的设置就行了。

具体操作:

在MySQL的配置文件my.ini中增加一行:

 代码如下 复制代码

lower_case_table_names = 0

其中 0:区分大小写,1:不区分大小写

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

1、数据库名与表名是严格区分大小写的;

2、表的别名是严格区分大小写的;

3、列名与列的别名在所有的情况下均是忽略大小写的;

4、变量名也是严格区分大小写的;    MySQL在Windows下都不区分大小写

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

时间: 2024-10-25 11:05:52

MySql中varchar,char类型排序CAST CONVERT的相关文章

MySQL中varchar最大长度是多少?

  被问到一个问题:MySQL中varchar最大长度是多少?这不是一个固定的数字.本文简要说明一下限制规则. 1.限制规则 字段的限制在字段定义的时候有以下规则: a) 存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535. b) 编码长度限制 字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21

探究MySQL中varchar的定义长度_Mysql

UTF8字符集下: SQL>create table test(id int auto_increment,name varchar(10),primary key(id)); SQL>insert into test values(null,'1234567890'); Query OK, 1 row affected (0.00 sec) SQL>insert into test values(null,'一二三四五六七八九十'); Query OK, 1 row affected

数据库-java中Date类型如何与mysql中的datetime类型联系

问题描述 java中Date类型如何与mysql中的datetime类型联系 我在Mysql中建了一个datetime类型的数据 然后想在java中用Date类型来获取当前时间(变量名为inTime)并添加到数据库中 构造了一个函数,在传参数的时候应该怎么传, 还是到底是Import java.util.Date还是import java.sql.Date 并且我希望的时间格式为:2016-01-04 21:09:23 构造函数这样写对吗 public CheckIn( java.sql.Dat

mysql-请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用?

问题描述 请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用? 请教数据库大神,MySQL中的point类型数据取出来之后如何转化为字符串在后台使用?我想通过这个得到的坐标去计算两个坐标之间的距离,但是取出来后没法转化成字符串,大神们,帮帮忙,谢谢了! 解决方案 select AsText(point) from T;

c++-C#中的string或者char类型数据如何转化为C++中的char类型数据

问题描述 C#中的string或者char类型数据如何转化为C++中的char类型数据 C++代码:bool hasfire(char s[100]) 因为使用C++做DLL文件,调用hasfire()这个函数时,发现C#中的char类型和C++中的不大一样,不知道怎么处理才能把C#中的char转化成C++中的char类型.

java数组-java中的char类型数组怎么对其赋值?

问题描述 java中的char类型数组怎么对其赋值? 刚学期望得到大家回答,在网上没有搜索到,网上都是写string的用scanner.next().谢谢了 解决方案 String str="hahah"://创建字符串 char[] chArray=new char[10];//创建一个char空数组 chArray=str.toCharArray();//将字符串赋值进去 解决方案二: Scanner方法中没有直接读取character的方法,用String转换好了. 解决方案三:

Java 和 C/C++ 中的char 类型长度学习笔记

java 和 c/c++ 中的char 类型长度学习笔记 这两天在帮同学改一个加密程序.以下是c++语言的核心代码: char cpass[5]; for(int j=0;j<instring.length();j++){      cpass[j] ^= npwd;}   但是转成 java 写时会出现问题,乍一看,几乎可以原封不动的转换,可是结果却是有问题的. 经过网上资料的查找发现,是char类型的问题.实际上这就涉及到 c/c++ 中的数据类型和 java 的数据类型的比较. 先说 ch

MySql varchar排序 CAST ,CONVERT及用法

先看官网参考  代码如下 复制代码 CONVERT(expr USING transcoding_name) In MySQL, transcoding names are the same as the corresponding character set names. Examples:  代码如下 复制代码 SELECT CONVERT(_latin1'Müller' USING utf8); INSERT INTO utf8table (utf8column)     SELECT C

sql varchar排序CAST/CONVERT实现语句

是今天在后台发现排序有问题.于是,没办法,改之.下面简单说一下MySQL的varchar排序问题,引以为戒. 示例表结构: 先来看一下,我的表结构  代码如下 复制代码 show create table cardserver G *************************** 1. row ***************************        Table: cardserver Create Table: CREATE TABLE `cardserver` (   `i