執(zhí)行show
語句看一下一個普通表的結(jié)構(gòu):
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';
輸出:
可以發(fā)現(xiàn)竟然查出來了,而且簡單對比一下,感覺查出來的
id
就是字符串中的1
啊,那么是為什么呢,其實mysql針對這種需要類型轉(zhuǎn)換的時候進行了隱式轉(zhuǎn)換,像字符串轉(zhuǎn)為int
呢方法就是將字符串從前向后截取到非數(shù)字的地方,然后把后面全部改成0并求和,相當(dāng)于轉(zhuǎn)化的值就是第一個非數(shù)字的位置前面代表的數(shù)字.這里后來也發(fā)現(xiàn)了一個其他的問題,就是在查看執(zhí)行計劃時發(fā)現(xiàn)如果截取的數(shù)字超過字段對應(yīng)的類型的話是不會查詢的,來比較一下:
在范圍內(nèi)的情況:
EXPLAIN SELECT * FROM test.user WHERE id = '1-fad';
超過范圍的情況:
EXPLAIN SELECT * FROM test.user WHERE id = '1231231231231-fad';
結(jié)果顯而易見,各項都是空,mysql直接返回結(jié)果