【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中,儘量避免這種隱式類型轉換,這種有時候會遇到一些奇怪的錯誤不好排查,也會影響到查詢速度。

自己工作中錯誤的記錄,如有什麼不當,還請指教

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