Mysql数据类型转换详解

mysql数据表内的字段user_id是varchar类型,查询数据时希望以user_id排序,直接排序输出结果:

select user_id from user order by user_id desc limit 10;
+———–+
| user_id |
+———–+
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 10        |
| 1         |
+———–+
但是,我们想要的结果应该是 10,8,7,6,5 这个顺序。上面的做法是按照字符串的ASCII码进行排序的,而我们希望把user_id当做数值来排序。

最简单的方法,手动转换类型:

用下面的方法就可以,使user_id+0之后再排序,问题便可解决,不过这种写法显得并不规范。

select user_id from user order by user_id+0 desc limit 10;
+———–+
| user_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+

规范做法,使用MySQL为我们提供的类型转换函数CAST/CONVERT:

CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。
这个类型,可以是Mysql数据基本类型其中的任何一个:
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

使用CAST函数解决问题:

select user_id from user order by CAST(user_id as SIGNED) desc limit 10;
+———–+
| user_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+

使用CONVERT函数解决问题:

select user_id from user order by CONVERT(user_id,SIGNED) desc limit 10;
+———–+
| user_id |
+———–+
| 10        |
| 8         |
| 7         |
| 6         |
| 5         |
| 4         |
| 3         |
| 2         |
| 1         |
+———–+

其中,SIGNED代表有符号整形数据,完整写法:SIGNED int (int可省略),当然也可以将整形数据转换为字符串类型

推荐大家对MySql数据类型转换使用CAST或CONVERT函数,可读性强,代码规范,格式良好!

打赏此文

如果您觉得本站的内容对您有所帮助,您可以扫描下面的二维码小额支付请我喝杯茶,感谢!打赏记录
支付宝
微信
承诺:凡打赏捐助的朋友,留言备注自己的邮箱,在打赏捐助时间点的6个月内,本站会每周邮件推送原创专业技术博文,供大家学习和参考!

1 条评论

  1. 23摄氏度说道:

    强烈推荐的一篇文章,很不错

留下评论

All fields marked (*) are required