大家好,又见面了,我是你们的朋友全栈君。
问题出现
当我用navicat查询时,在
varchar
字段上where查询使用的是int类型的0【忘记打引号了…】,结果查出一堆其他的字符串,很奇怪。
首先,我想到的是类似于between and,我以为也是比较的首字母,不过后面我发现并不是的。
百度搜素之后发现是在这查询的时候MySQL把字符串转化为数字,并且有几种方式:
1. 方法一: 字段值 + 0
MySql 会根据上下文自动转换类型,这里会将被本来是字符类型的字段值以数值型返回,如果字段存放的值为数值字符,则会转换为数值型返回,如果字段存放的值为字母或者汉字,则直接返回 0。
示例
SELECT 'abd'+0 # 结果为 0
SELECT 'abd5'+0 # 结果为 0
SELECT '5abd'+0 # 结果为 5
SELECT '5abd5'+0 # 结果为 5
select '2FF351C4AC744E2092DCF08CFD314420' + 0 # 结果为0
SELECT '55'+0 # 结果为 55
应用
假如在city
中有gdp字段,且里面全是数字(但是在储存的时候是varchar类型),问:如何进行排序?
select * from city ORDER BY gdp+0 ASC
# 查询结果如下
4 深圳 980
1 北京 1200
3 广州 6000
2 上海 6100
select * from city ORDER BY gdp+0 DESC
# 查询结果如下
2 上海 6100
3 广州 6000
1 北京 1200
4 深圳 980
2. 方法二: 通过 case()
函数
CAST()
函数,把一个字段的值转成另一个类型并输出。
用法:CAST ( 字段名 AS 转换的类型 )
select * from city ORDER BY CAST(gdp AS SIGNED) ASC
# 查询结果如下
4 深圳 980
1 北京 1200
3 广州 6000
2 上海 6100
select * from city ORDER BY CAST(gdp AS SIGNED) DESC
# 查询结果如下
2 上海 6100
3 广州 6000
1 北京 1200
4 深圳 980
unsigned
表示无符号,不能表示小数signed
表示有符号,可以表示小数
3. 方法三: 通过 CONVERT()
函数
CONVERT()
函数,把一个字段的值转成另一个类型并输出。
用法:CONVERT ( 字段名 , 转换的类型 )
select * from city ORDER BY CONVERT(gdp,SIGNED) ASC
# 查询结果如下
4 深圳 980
1 北京 1200
3 广州 6000
2 上海 6100
select * from city ORDER BY CONVERT(gdp,SIGNED) DESC
# 查询结果如下
2 上海 6100
3 广州 6000
1 北京 1200
4 深圳 980
- unsigned 表示无符号,不能表示小数
- signed 表示有符号,可以表示小数
参考:
关于Mysql的隐式转化的规则介绍等:https://yq.aliyun.com/articles/39477
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139315.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...