一、首先創建一張測驗表,隨便插入一點測驗資料:
CREATE TABLE `test_index` ( `id` int(11) NOT NULL AUTO_INCREMENT, `no` int(11) NOT NULL DEFAULT '0' COMMENT '訂單號,int型', `no_str` varchar(64) NOT NULL DEFAULT '' COMMENT '訂單號,字串', PRIMARY KEY (`id`), KEY `no` (`no`) USING BTREE, KEY `no_str` (`no_str`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
為了方便對比,我建了兩個欄位,都建立了索引,no (整型)和 no_str (字串),
那么查詢時就會出現以下四種情況:
1、欄位是int型,但是查詢時使用字串型別
EXPLAIN select * from test_index where no = '1005';


可以看到能正常使用索引,而且查詢結果也似乎正常,no 等于 1005 的資料都能查詢出來,其實這時候MySQL已經進行了隱式型別轉換,轉成了浮點型處理,索引才能正常使用,
需要特別注意的是,這種查詢可能會出現問題,

比如將查詢條件由 1005 變成 1005aa,發現也同樣能查詢到 1005 的資料,這是因為MySQL在進行欄位值比較的時候,發生了隱式型別轉換,將 1005aa 轉換成浮點型 1005 進行比較,所以能查詢出 1005 的記錄,
2、欄位是int型,查詢也用int型

這個沒什么說的,不管是查詢結果和使用索引都達到預期效果,
3、欄位是字串型別,查詢使用int型


首先發現 no_str 索引失效了,并且結果也不是預期結果,會將額外的資料查詢出來,比如查詢 1005 會把 1005aa 的記錄也查出來,這是因為MySQL進行了隱式型別轉換,換成了浮點型進行比較,
4、欄位是字串型別,查詢使用字串

正常使用索引,結果也正常,
所以在實際開發中,需要特別注意這種隱式的型別轉換導致的問題,可能會導致索引失效,查詢結果也出現問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/514320.html
標籤:其他
