在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。
官方的隱試轉換說明:
兩個引數至少有乙個是 null 時,比較的結果也是 null,例外是使用 <=> 對兩個 null 做比較時會返回 1,這兩種情況都不需要做型別轉換
兩個引數都是字串,會按照字串來比較,不做型別轉換
兩個引數都是整數,按照整數來比較,不做型別轉換
十六進製制的值和非數字做比較時,會被當做二進位制串
有乙個引數是 timestamp 或 datetime,並且另外乙個引數是常量,常量會被轉換為 timestamp
有乙個引數是 decimal 型別,如果另外乙個引數是 decimal 或者整數,會將整數轉換為 decimal 後進行比較,如果另外乙個引數是浮點數,則會把 decimal 轉換為浮點數進行比較
所有其他情況下,兩個引數都會被轉換為浮點數再進行比較
常見情況:
id為int
select * from `test` where id= '10000';
左邊為int型別10000
,轉換為浮點數還是10000
,右邊字串型別'10000'
,轉換為浮點數也是10000
。兩邊的轉換結果都是唯一確定的,沒有破壞索引規則。所以不影響使用索引。
id為varchar
select * from `test` where id = 10000;
左邊是字串型別'10000'
,轉浮點數為10000是唯一的,右邊int
型別10000
轉換結果也是唯一的。但是,因為左邊是檢索條件,'10000'
轉到10000
雖然是唯一,但是其他字串也可以轉換為10000
,比如'10000a'
,'010000'
,'10000'
等等都能轉為浮點數10000
,這樣的情況下,索引規則被破壞,是不能用到索引的。
當我們使用的字段是數值型別時,加引號或者不加引號(sql中單引號和雙引號實現相同效果)都不影響索引的使用
當我們的字段是字串型別時,不加引號的查詢無法使用索引,加引號的查詢才可正常使用索引
綜上所述,我認為以後寫sql的時候注意最好都加上引號,避免這種字串型別的不走索引的情況發生
mysql 隱式轉換 mysql中的隱式轉換
在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。下面分析兩種隱式轉換的情況 看表結構 phone為 int型別,name為 varchar 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但...
mysql 關閉隱式轉換 Mysql中的隱式轉換
在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引,下面分析兩種隱式轉換的情況看表結構phone為int型別,name為varchar型別 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但因為...
mysql日期隱式轉換 mysql中的隱式轉換
什麼隱式型別轉換?在mysql中 當操作符與不同型別的運算元一起使用時,會發生型別轉換以使運算元相容。則會發生轉換隱式 也就是說,mysql會根據需要自動將數字轉換為字串,將字串轉換數字。看到這個概念之後,是不是有一種茅塞頓開的感覺。哦.原來在資料結構中telephone欄位為字串 varchar ...