MySQL隱式數(shù)據(jù)轉(zhuǎn)換

引出

考慮如下問題:假設(shè)我們在MySQL中存在表test玻褪,結(jié)構(gòu)如下:

CREATE TABLE `test` (
  `id` bigint(20),
  `name` varchar(20),
  PRIMARY KEY (`id`),
  KEY `ix_name` (`name`)
);

則我們寫出如下SQL:

select * from test where name = 123;
select * from test where id = '12';

問:此時這兩條SQL都會走索引嗎闹获?
答:第一條不會杨赤,第二條會雹顺。
原因:
第一條:MySQL的隱式數(shù)據(jù)轉(zhuǎn)換導致name會轉(zhuǎn)換為浮點數(shù)然后和123的浮點數(shù)比較句葵,這句話的意思就是希望找到表中name轉(zhuǎn)換為浮點數(shù)后是123的行記錄厕鹃。
所以整個過程就是遍歷test的每條記錄,依次進行類型轉(zhuǎn)換后與123比較乍丈。顯然不走索引剂碴。
第二條:MySQL的隱式數(shù)據(jù)轉(zhuǎn)換導致'12'會轉(zhuǎn)換為數(shù)字12,這句話的意思就是:在表中想要找到id為數(shù)字12的行轻专。
則上述語句和如下語句等同:

select * from test where id = 12;

所以顯然是走索引的忆矛。

MySQL隱式數(shù)據(jù)轉(zhuǎn)換

下面引入一段大家在很多地方都可以看到的話,即官方文檔的翻譯版:

MySQL 的隱式類型轉(zhuǎn)換原則:
1.  兩個參數(shù)至少有一個是 NULL 時请垛,比較的結(jié)果也是 NULL催训,例外是使用 <=> 對兩個 NULL 做比較時會返回 1洽议,這兩種情況都不需要做類型轉(zhuǎn)換
2.  兩個參數(shù)都是字符串,會按照字符串來比較漫拭,不做類型轉(zhuǎn)換
3.  兩個參數(shù)都是整數(shù)绞铃,按照整數(shù)來比較,不做類型轉(zhuǎn)換
4.  十六進制的值和非數(shù)字做比較時嫂侍,會被當做二進制串儿捧,和數(shù)字做比較時會按下面的規(guī)則處理
5.  有一個參數(shù)是 TIMESTAMP 或 DATETIME,并且另外一個參數(shù)是常量挑宠,常量會被轉(zhuǎn)換為 timestamp
6.  有一個參數(shù)是 decimal 類型菲盾,如果另外一個參數(shù)是 decimal 或者整數(shù),會將整數(shù)轉(zhuǎn)換為 decimal 后進行比較各淀,如果另外一個參數(shù)是浮點數(shù)懒鉴,則會把 decimal 轉(zhuǎn)換為浮點數(shù)進行比較
7.  所有其他情況下,兩個參數(shù)都會被轉(zhuǎn)換為浮點數(shù)再進行比較

注意一個安全問題:假如 password 類型為字符串碎浇,查詢條件為 int 0 則會匹配上临谱。

其實這7條都很好理解。

說一下最后的注意問題:
  • 這句話的意思是任何不以數(shù)字開頭的字符串轉(zhuǎn)換為浮點數(shù)的時候奴璃,結(jié)果都是0悉默。
    舉個??:


    image.png

    可以看到where name = 0居然將所有行查出來了。所以說如果password傳入的是數(shù)字0苟穆,且SQL又沒有類型檢測的話抄课,密碼就可以這樣被破解了。

  • 上面的話沒有說完雳旅,如果以數(shù)字開頭呢跟磨?


    image.png

    可以看到這種轉(zhuǎn)換是取開頭的數(shù)字字符,如果沒有取到則直接輸出0攒盈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抵拘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子型豁,更是在濱河造成了極大的恐慌僵蛛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偷遗,死亡現(xiàn)場離奇詭異墩瞳,居然都是意外死亡驼壶,警方通過查閱死者的電腦和手機氏豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热凹,“玉大人泵喘,你說我怎么就攤上這事泪电。” “怎么了纪铺?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵相速,是天一觀的道長。 經(jīng)常有香客問我鲜锚,道長突诬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任芜繁,我火速辦了婚禮旺隙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骏令。我一直安慰自己蔬捷,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布榔袋。 她就那樣靜靜地躺著周拐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凰兑。 梳的紋絲不亂的頭發(fā)上妥粟,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音吏够,去河邊找鬼罕容。 笑死,一個胖子當著我的面吹牛稿饰,可吹牛的內(nèi)容都是我干的锦秒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼喉镰,長吁一口氣:“原來是場噩夢啊……” “哼旅择!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣姆,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤生真,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捺宗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柱蟀,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年蚜厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了长已。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖术瓮,靈堂內(nèi)的尸體忽然破棺而出康聂,到底是詐尸還是另有隱情,我是刑警寧澤胞四,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布恬汁,位于F島的核電站,受9級特大地震影響辜伟,放射性物質(zhì)發(fā)生泄漏氓侧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一导狡、第九天 我趴在偏房一處隱蔽的房頂上張望甘苍。 院中可真熱鬧,春花似錦烘豌、人聲如沸载庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚聚。三九已至,卻和暖如春标锄,著一層夾襖步出監(jiān)牢的瞬間顽铸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工料皇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谓松,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓践剂,卻偏偏與公主長得像鬼譬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逊脯,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容