令人迷惑的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轉換寫在最後
最近寫東西越來越乏力了,因為太熱了。
推薦閱讀:
※BIM資料庫·標準導入助力建企轉型升級
※MySQL基礎(二):列類型、列屬性
※MySQL的Hash索引
※MySQL高可用架構之MHA(4)- 完結
※MySQL查詢優化器帶來的潛在問題