国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

談?wù)凪ySQL中的隱式轉(zhuǎn)換

瀏覽:19日期:2023-10-10 10:08:42

工作過程中會(huì)遇到比較多關(guān)于隱式轉(zhuǎn)換的案例,隱式轉(zhuǎn)換除了會(huì)導(dǎo)致慢查詢,還會(huì)導(dǎo)致數(shù)據(jù)不準(zhǔn)。本文通過幾個(gè)生產(chǎn)中遇到的案例來。

基礎(chǔ)知識(shí)

關(guān)于比較運(yùn)算的原則,MySQL官方文檔的描述: https://dev.mysql.com/doc/refman/5.6/en/type-conversion.html

如果 判斷符號(hào)左右兩邊有一個(gè)為NULL,結(jié)果就是null,除非使用安全的等值判斷 <=>

(none) 05:17:16 >select null = null;+-------------+| null = null |+-------------+|NULL |+-------------+1 row in set (0.00 sec)(none) 05:34:59 >select null <=> null;+---------------+| null <=> null |+---------------+| 1 |+---------------+1 row in set (0.00 sec)(none) 05:35:51 >select null != 1;+-----------+| null != 1 |+-----------+| NULL |+-----------+1 row in set (0.00 sec)

如何判斷左右兩邊都是相同類型的,比如都是字符串,則以字符串進(jìn)行對(duì)比。如果是數(shù)字,則以數(shù)字進(jìn)行比較。

注意 對(duì)于比較常見的 字符串與數(shù)字類型的比較的情況,如果字符串字段是索引字段,那么MySQL 無法通過索引進(jìn)行查找數(shù)據(jù),比如以下例子:

(none) 05:39:42 >select 1=’1’;+-------+| 1=’1’ |+-------+| 1 |+-------+1 row in set (0.00 sec)(none) 05:39:44 >select 1=’1A’;+--------+| 1=’1A’ |+--------+| 1 |+--------+1 row in set, 1 warning (0.00 sec)(none) 05:39:47 >select 1=’1 ’; ##1后有空格+--------+| 1=’1 ’ |+--------+| 1 |+--------+1 row in set (0.00 sec)

MySQL 認(rèn)為數(shù)字1 與’1’,’1_’,’1A’ 相等,故無法通過索引二分查找準(zhǔn)確定位到具體的值。

Hexadecimal(十六進(jìn)制)以二進(jìn)制字符串的方式進(jìn)行比較。

如何判斷符號(hào)左邊是 timestamp 或者datetime類型的,右邊是常量,在比較之前,常量會(huì)被轉(zhuǎn)換為時(shí)間類型。

隱式轉(zhuǎn)換

字段類型不一樣

In all other cases, the arguments are compared as floating-point (real) numbers.

除了以上的其他類型的比較,系統(tǒng)將字段和參數(shù)轉(zhuǎn)換為浮點(diǎn)型進(jìn)行比較。使用浮點(diǎn)數(shù)(或轉(zhuǎn)換為浮點(diǎn)數(shù)的值)的比較是近似的,因?yàn)檫@樣的數(shù)字是不精確的。看下面2個(gè)例子

>select ’190325171202362933’ = 190325171202362931;+-------------------------------------------+| ’190325171202362933’ = 190325171202362931 |+-------------------------------------------+| 1 |+-------------------------------------------+1 row in set (0.00 sec)>select ’190325171202362936’ = 190325171202362931;+-------------------------------------------+| ’190325171202362936’ = 190325171202362931 |+-------------------------------------------+| 1 |+-------------------------------------------+1 row in set (0.00 sec)

直觀上不相等的值,做等值判斷之后竟然返回為1。這樣帶來2個(gè)問題不能利用索引且結(jié)果數(shù)據(jù)不準(zhǔn)

>select ’190325171202362931’+0.0;+--------------------------+| ’190325171202362931’+0.0 |+--------------------------+| 1.9032517120236294e17 |+--------------------------+1 row in set (0.00 sec)>select ’190325171202362936’+0.0;+--------------------------+| ’190325171202362936’+0.0 |+--------------------------+| 1.9032517120236294e17 |+--------------------------+1 row in set (0.00 sec)

將上面的值轉(zhuǎn)換為浮點(diǎn)數(shù),都是 1.9032517120236294e17,所以判斷相等時(shí)為真,返回True。

in 參數(shù)包含多個(gè)類型

具體的案例參考之前的一篇文章MySQL優(yōu)化案例一則 ,where 條件 in 集合里面的數(shù)據(jù)類型不一樣,執(zhí)行計(jì)劃未利用到索引

談?wù)凪ySQL中的隱式轉(zhuǎn)換

淘寶MySQL月報(bào)(http://mysql.taobao.org/monthly/2017/12/06/ )里面有一篇正好和這個(gè)一樣的案例,推薦給大家 簡單說,就是在IN的入口有一個(gè)判斷, 如果in中的字段類型不兼容, 則認(rèn)為不可使用索引.

談?wù)凪ySQL中的隱式轉(zhuǎn)換

而這個(gè)arg_types_compatible 的賦值邏輯是:

if (type_cnt == 1) arg_types_compatible = TRUE;

也就是說,當(dāng)IN列表中出現(xiàn)超過一個(gè)字段類型時(shí), 就認(rèn)為類型不兼容,從而不能利用索引。

字符集類型不一致

環(huán)境準(zhǔn)備:

CREATE TABLE `t1` (`id` int(11) NOT NULL AUTO_INCREMENT,`c1` varchar(20) DEFAULT NULL,`c2` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_c1` (`c1`),KEY `idx_c2` (`c2`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `t2` (`id` int(11) NOT NULL AUTO_INCREMENT,`c1` varchar(20) DEFAULT NULL,`c2` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_c1` (`c1`),KEY `idx_c2` (`c2`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;insert into t1(c1,c2) values(’a’,’a’),(’b’,’b’),(’c’,’c’),(’d’,’d’),(’e’,’e’);insert into t2(c1,c2) values(’a’,’a’),(’b’,’b’),(’c’,’c’),(’d’,’d’),(’e’,’e’);

測試結(jié)果

談?wù)凪ySQL中的隱式轉(zhuǎn)換

小結(jié)

希望通過以上案例,基礎(chǔ)知識(shí)介紹,開發(fā)同學(xué)能少走彎路,在開發(fā)編寫sql的階段一定要明確字段的類型,尤其是看起來像數(shù)字類型的id,xxxid,xxxno 這類字段,實(shí)際上可能是字符類型。

以上就是談?wù)凪ySQL中的隱式轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于MySQL 隱式轉(zhuǎn)換的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 日本人视频网站一 | 国产资源精品一区二区免费 | 日韩亚洲欧美一区噜噜噜 | 91网站网站网站在线 | 韩国欧洲一级毛片免费 | 色综合亚洲七七久久桃花影院 | 色噜噜狠狠大色综合 | 久久国产乱子伦精品免费不卡 | 亚洲免费视频网址 | 久久影院yy6080 | 国产日韩精品一区在线观看播放 | 成人自拍网站 | 99国产精品欧美久久久久久影院 | 国产片在线观看狂喷潮bt天堂 | 国产小片 | 国产精品一区二区综合 | 国产一区二区三区久久精品小说 | 香蕉国产人午夜视频在线 | 久久亚洲精品一区成人 | 成人18免费| 欧美aaaa在线观看视频免费 | 欧美一级鲁丝片 | 精品国产欧美一区二区最新 | 亚洲成人精品 | 色老久久| 国产高清视频在线播放 | 玖玖爱zh综合伊人久久 | 精品91一区二区三区 | 波多野结衣免费视频观看 | 香蕉521av网站永久地址 | 亚洲在线观看免费 | 亚洲天堂网在线视频 | 久久不射网 | 又黄又湿又爽吸乳视频 | 手机av在线播放 | 欧美色视频在线观看 | 亚洲网站免费观看 | 国产欧美日韩图片一区二区 | 亚洲国产成人久久综合野外 | 国产成人精品区在线观看 | 久草久草久草 |