執行show
語句看一下一個普通表的結構:
SHOW CREATE TABLE test.user;
輸出:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`name` varchar(20) NOT NULL,
`age` int(11) DEFAULT NULL,
`sex` varchar(10) NOT NULL,
`card` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `card` (`card`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶信息表'
注意到這里id
字段是bigint
類型,那么如果我查詢記錄時where
條件判斷id
等于一個字符串會怎樣呢?來試一下:
SELECT * FROM test.user WHERE id = '1-fad';
輸出:
可以發現竟然查出來了,而且簡單對比一下,感覺查出來的
id
就是字符串中的1
啊,那么是為什么呢,其實mysql針對這種需要類型轉換的時候進行了隱式轉換,像字符串轉為int
呢方法就是將字符串從前向后截取到非數字的地方,然后把后面全部改成0并求和,相當于轉化的值就是第一個非數字的位置前面代表的數字.這里后來也發現了一個其他的問題,就是在查看執行計劃時發現如果截取的數字超過字段對應的類型的話是不會查詢的,來比較一下:
在范圍內的情況:
EXPLAIN SELECT * FROM test.user WHERE id = '1-fad';
超過范圍的情況:
EXPLAIN SELECT * FROM test.user WHERE id = '1231231231231-fad';
結果顯而易見,各項都是空,mysql直接返回結果