【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中,尽量避免这种隐式类型转换,这种有时候会遇到一些奇怪的错误不好排查,也会影响到查询速度。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章