遇到的問(wèn)題
最近一位以前的老同學(xué)找到我,跟我說(shuō)他們線上有出現(xiàn)了兩個(gè)由sql語(yǔ)句引起的事故,并且都沒(méi)找到原因。其中一個(gè)事故簡(jiǎn)單描述如下。
一個(gè)簡(jiǎn)單的mysql blog表
CREATE TABLE `blog` (
`id` int(11) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
其中一行數(shù)據(jù)為
INSERT INTO `blog` VALUES ('1', '32019051669436435');
查詢語(yǔ)句:
select * from blog where title = 32019051669436436
結(jié)果查出了title為32019051669436435的數(shù)據(jù):

image.png
原因
這個(gè)原理其實(shí)很簡(jiǎn)單,其實(shí)就是發(fā)生了隱式參數(shù)轉(zhuǎn)換,title為varchar類型,而查詢語(yǔ)句中使用的是數(shù)值類型,因?yàn)閙ysql innodb varchar與數(shù)值類型的比較會(huì)轉(zhuǎn)換成double類型去比較。而double類型是有精度限制的。導(dǎo)致這個(gè)問(wèn)題的發(fā)生。
思考
這類問(wèn)題該怎么防止呢?
其實(shí)很難讓每個(gè)人程序員都知道m(xù)ysql底層的隱式參數(shù)轉(zhuǎn)換的每個(gè)細(xì)節(jié)。
我們應(yīng)該謹(jǐn)記會(huì)發(fā)生隱式參數(shù)轉(zhuǎn)換的情況,并且寫sql時(shí),要注意字段比較不能發(fā)生隱式參數(shù)轉(zhuǎn)換,就不會(huì)發(fā)生這類問(wèn)題。
隱式參數(shù)轉(zhuǎn)換的情況:
- 字符集不一樣:比如utf-8余utf-mb4不一樣,比較時(shí)會(huì)發(fā)生轉(zhuǎn)換,可能會(huì)使索引失效
- 數(shù)據(jù)類型不一樣