问题出现

当我用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

Logo

更多推荐