令人迷惑的SQL查詢結果

令人迷惑的SQL查詢結果

來自專欄有財家的雜談

現象

廢話不說,首先看錶ddl:

CREATE TABLE `idx_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` int(11) NOT NULL DEFAULT 0, `c2` varchar(100) NOT NULL DEFAULT , `c3` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c1` (`c1`,`c2`)) ENGINE=InnoDB;

執行這樣一句SQL:

select * from idx_test where c1 = 1a;

不僅不會報錯,還能查出結果:

原因分析

其實還有一個讓人驚訝的地方,就是這個看起來錯的一塌糊塗的SQL,竟然還能走索引:

查詢效率還是挺高的。

從上面現象上來看,實際上執行的SQL應該是:

select * from idx_test where c1 = 1;

這是有原因的,這個原因其實在我以前的文章中也是提到過的,就是MySQL自動會對一些類型進行轉換,這個看似錯誤的語句實際上應該是這樣處理的:

select * from idx_test where c1 = cast(1a as unsigned);

cast的結果剛好是1,因此得到那個讓人迷惑的結果也是正常的了。這是MySQL自己搞出來的特性,看起來就不是那麼嚴謹了,其實最好是報錯。

參考我以前寫的文章就可以知道所以然了:

有財君:MySQL日常踩坑之varchar轉換?

zhuanlan.zhihu.com圖標

寫在最後

最近寫東西越來越乏力了,因為太熱了。

推薦閱讀:

BIM資料庫·標準導入助力建企轉型升級
MySQL基礎(二):列類型、列屬性
MySQL的Hash索引
MySQL高可用架構之MHA(4)- 完結
MySQL查詢優化器帶來的潛在問題

TAG:SQL | SQL語句 | MySQL |