使用select 語句進行查詢時,變量名不加引號會致使的錯誤

今天作PHP項目時,數據庫類找了個別人封裝好的,使用時候遇到了一些問題,看了他的源碼,發現了一些,數據庫上的錯誤。mysql

 

假設一個數據庫表中存有以下信息,其中login_uuid字段數據類型爲varcharsql

當咱們查找999這條數據時,使用這樣的查詢語句數據庫

查詢出來的結果也是,咱們所指望的ui

可是,若是沒有在999處加引號,會出現錯誤

查詢結果爲spa

全部,999開頭的都查出來了,緣由以下blog

這樣會走mysql的隱式轉換的,實際是走全表掃描,把每行都執行CAST(login_uuid as signed int)後與where條件的999比較

即,把每一個varchar都強轉成int去和999比較(所以a999是找不到的)
能夠經過select CAST('999+' as signed int)= 999;看結果

發現果真是1索引

另外就是你們比較熟知的了源碼

不加引號會致使強制轉換,不走索引,效率低。

最後引用大佬說的話效率

這是mysql的機制啦,因此比較時候要注意字段的在ddl的類型,用錯類型比較,可能會出現全表掃或者有歧義的狀況。

相關文章
相關標籤/搜索