MySql varchar排序 CAST ,CONVERT及用法

互联网十八般武艺 互联网十八般武艺

文章从头到尾详细的介绍了CAST与CONVERT用法,以及它们对varchar字符排序,有需要的朋友可参考一下.

先看官网参考,代码如下:

  1. CONVERT(exprUSINGtranscoding_name)
  2. InMySQL,transcodingnamesarethesameasthecorrespondingcharactersetnames.

Examples,代码如下:

  1. SELECTCONVERT(_latin1'Müller'USINGutf8);
  2. INSERTINTOutf8table(utf8column)
  3. SELECTCONVERT(latin1fieldUSINGutf8)FROMlatin1table;CONVERT(...USING...)isimplementedaccordingtothestandardSQLspecification.
  4. YoumayalsouseCAST()toconvertastringtoadifferentcharacterset.Thesyntaxis:
  5. CAST(character_stringAScharacter_data_typeCHARACTERSETcharset_name)

Example,代码如下:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

CONVERT()提供一个在不同字符集之间转换数据的方法,语法是:

CONVERT(expr USING transcoding_name)

在 MySQL中,转换代码名与相应的字符集名相同。

例子,代码如下:

  1. SELECTCONVERT(_latin1'Müller'USINGutf8);
  2. INSERTINTOutf8table(utf8column)SELECTCONVERT(latin1fieldUSINGutf8)FROMlatin1table;CONVERT(...USING...)

根据标准SQL规范实施.

在传统SQL模式中,如果你转换一个“0”日期字符串到日期类型,CONVERT()函数返回NULL,在MySQL5.1中还产生一条警告.

示例表结构,先来看一下,我的表结构,代码如下:

  1. showcreatetablecardserverG
  2. ***************************1.row***************************
  3. Table:cardserver
  4. CreateTable:CREATETABLE`cardserver`(
  5. `id`int(11)NOTNULLdefault'0',
  6. `ver`int(11)defaultNULL,
  7. `createtime`datetimedefaultNULL,
  8. `updatetime`datetimedefaultNULL,
  9. `game_id`int(2)NOTNULLdefault'0',
  10. `server_id`varchar(2)NOTNULLdefault'',
  11. `server_name`varchar(40)NOTNULLdefault'',
  12. PRIMARYKEY(`id`),
  13. UNIQUEKEY`game_id_server_id`(`game_id`,`server_id`),
  14. UNIQUEKEY`game_id_server_name`(`game_id`,`server_name`)
  15. )ENGINE=InnoDBDEFAULTCHARSET=gbk
  16. 1rowinset(0.00sec)

因为有外键的存在,所以我不想改变字段类型,费劲啊,呵呵,虽然最后我还是选择了更改字段类型,这是后话,因为我本篇日志想要说明的是varchar排序问题。所以不再说明我是如何更改字段类型的,大家有兴趣可以搜索我以前的日志.

现象描述:下面,我从数据库里面以server_id排一下序,大家来看一下排序后的结果,代码如下:

  1. selectserver_idfromcardserverwheregame_id=1orderbyserver_iddesclimit10;
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |8|
  6. |7|
  7. |6|
  8. |5|
  9. |4|
  10. |3|
  11. |2|
  12. |10|
  13. |1|
  14. +-----------+

很明显,我想要的结果应该是 10,8,7,6,5 这样的,但是这个10排在了2的后面,按照字符串来排的,其实我是想把它当做数值来排.

手动转换类型,用下面的方法就可以了,使server_id+0之后再排序,问题解决了,代码如下:

  1. selectserver_idfromcardserverwheregame_id=1orderbyserver_id+0desclimit10;--phpfensi.com
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |10|
  6. |8|
  7. |7|
  8. |6|
  9. |5|
  10. |4|
  11. |3|
  12. |2|
  13. |1|
  14. +-----------+

使用MySQL函数CAST/CONVERT:

mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过?

CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值.

这个类型 可以是以下值其中的 一个:

  1. BINARY[(N)]
  2. CHAR[(N)]
  3. DATE
  4. DATETIME
  5. DECIMAL
  6. SIGNED[INTEGER]
  7. TIME
  8. UNSIGNED[INTEGER]

所以我们也可以用CAST解决问题,代码如下:

  1. selectserver_idfromcardserverwheregame_id=1orderbyCAST(server_idasSIGNED)desclimit10;
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |10|
  6. |8|
  7. |7|
  8. |6|
  9. |5|
  10. |4|
  11. |3|
  12. |2|
  13. |1|
  14. +-----------+

也可以使用CONVERT来搞定此问题:

  1. selectserver_idfromcardserverwheregame_id=1orderbyCONVERT(server_id,SIGNED)desclimit10;
  2. +-----------+
  3. |server_id|
  4. +-----------+
  5. |10|
  6. |8|
  7. |7|
  8. |6|
  9. |5|
  10. |4|
  11. |3|
  12. |2|
  13. |1|
  14. +-----------+

注:就是CAST(xxx AS 类型),CONVERT(xxx,类型),可以转换的类型是有限制的,这个类型可以是以下值其中的一个:

•二进制,同带binary前缀的效果:BINARY

•字符型,可带参数:CHAR()

•日期:DATE

•时间:TIME

•日期时间型:DATETIME

•浮点数:DECIMAL

•整数:SIGNED

•无符号整数:UNSIGNED

相关广告
  • MySql varchar排序 CAST ,CONVERT及用法 MySql varchar排序 CAST ,CONVERT及用法 MySql varchar排序 CAST ,CONVERT及用法
相关阅读

MySql varchar排序 CAST ,CONVERT及用法

2019/10/10 17:33:44 | 谷歌SEO算法 | 百度K站