【Mysql】当column = 0时,mySQL返回所有行

在使用MySql的时候,发现了一个非常奇怪的问题,下面是SQl:

select * from hs_basic_city where city_name = 0;
select * from hs_basic_city;

我的表中,city_name字段为varchar 类型,而且city_name列中没有为0的cityName,大家可以猜一下两条Sql查询出来的结果是什么?

结果两条SQL查询出来的内容是一样的

在网上搜索资料,看到 stack overflow中记录有:

Question :SELECT * FROM table WHERE email=0 returned all rows from the table.

Solution: This is because it is converting the email field (which I assume is a varchar
field) to an integer. Any field without a valid integer will equate to 0. You should make 
sure that you only compare string fields to string values (same goes for dates, comparing 
to dates). The query should be as follows.

SELECT * FROM table WHERE email='0';

意思就是:在Mysql中字符串和整数比较都会进行转换后再行比较,然而任何没有有效整数的字段都将转换成为0,因为把VARCHAR类型转换成整数类型, 不符合整数类型的被转为0,所以造成你的结果不是你想要的;

我自己做了一下实验,当数据类型是 CHAR 或者 VARCHAR 类型,当我们使用 file = 0 时,MySQL 会将该列的内容强制转换为整数,以便将它们与提供的0进行比较,即存在一个隐式转换的过程。当我们使用  file = '0' 时,查询的结果就是预期的效果;

下面是我做的转换的查询

SELECT CAST('武汉' AS SIGNED);

查询的结果如下:

然后我们再试一下正常转换

SELECT CAST('123' AS SIGNED) AS city_code;

结果如下:

在我们的SQL中,尽量避免这种隐式类型转换,这种有时候会遇到一些奇怪的错误不好排查,也会影响到查询速度。

自己工作中错误的记录,如有什么不当,还请指教

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值