亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在MySQL中。當(dāng)我們對不同類型的值進行比較的時候,為了使得這些數(shù)值「可比較」(也可以稱為類型的兼容性),MySQL會做一些隱式轉(zhuǎn)化(Implicit type conversion)。那么什么是“隱式轉(zhuǎn)換”呢?讓我們一起來了解一下吧!

當(dāng)我們對不同類型的值進行比較的時候,為了使得這些數(shù)值「可比較」(也可以稱為類型的兼容性),MySQL會做一些隱式轉(zhuǎn)化(Implicit type conversion)。比如下面的例子:

了解MySQL的隱式轉(zhuǎn)化

很明顯,上面的SQL語句的執(zhí)行過程中就出現(xiàn)了隱式轉(zhuǎn)化。并且從結(jié)果們可以判斷出,第一條SQL中,將字符串的“1”轉(zhuǎn)換為數(shù)字1,而在第二條的SQL中,將數(shù)字2轉(zhuǎn)換為字符串“2”。

MySQL也提供了CAST()函數(shù)。我們可以使用它明確的把數(shù)值轉(zhuǎn)換為字符串。當(dāng)使用CONCA()函數(shù)的時候,也可能會出現(xiàn)隱式轉(zhuǎn)化,因為它希望的參數(shù)為字符串形式,但是如果我們傳遞的不是字符串呢:

了解MySQL的隱式轉(zhuǎn)化

隱式轉(zhuǎn)化規(guī)則

官方文檔中關(guān)于隱式轉(zhuǎn)化的規(guī)則是如下描述的:

了解MySQL的隱式轉(zhuǎn)化

翻譯為中文就是:

  • 1.兩個參數(shù)至少有一個是 NULL 時,比較的結(jié)果也是 NULL,例外是使用 <=> 對兩個 NULL 做比較時會返回 1,這兩種情況都不需要做類型轉(zhuǎn)換
  • 2.兩個參數(shù)都是字符串,會按照字符串來比較,不做類型轉(zhuǎn)換
  • 3.兩個參數(shù)都是整數(shù),按照整數(shù)來比較,不做類型轉(zhuǎn)換
  • 4.十六進制的值和非數(shù)字做比較時,會被當(dāng)做二進制串
  • 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 則會匹配上。

了解MySQL的隱式轉(zhuǎn)化

相信上面的例子,一些機靈的同學(xué)可以發(fā)現(xiàn)其實上面的例子也可以做sql注入。

假設(shè)網(wǎng)站的登錄那塊做的比較挫,使用下面的方式:

了解MySQL的隱式轉(zhuǎn)化

如果username輸入的是a' OR 1='1,那么password隨便輸入,這樣就生成了下面的查詢:

了解MySQL的隱式轉(zhuǎn)化

就有可能登錄系統(tǒng)。其實如果攻擊者看過了這篇文章,那么就可以利用隱式轉(zhuǎn)化來進行登錄了。如下:

了解MySQL的隱式轉(zhuǎn)化

之所以出現(xiàn)上述的原因是因為:

了解MySQL的隱式轉(zhuǎn)化

下面通過一些例子來復(fù)習(xí)一下上面的轉(zhuǎn)換規(guī)則:

了解MySQL的隱式轉(zhuǎn)化

把字符串“aa”和1進行求和,得到1,因為“aa”和數(shù)字1的類型不同,MySQL官方文檔告訴我們:

了解MySQL的隱式轉(zhuǎn)化

查看warnings可以看到隱式轉(zhuǎn)化把字符串轉(zhuǎn)為了double類型。但是因為字符串是非數(shù)字型的,所以就會被轉(zhuǎn)換為0,因此最終計算的是0+1=1

上面的例子是類型不同,所以出現(xiàn)了隱式轉(zhuǎn)化,那么如果我們使用相同類型的值進行運算呢?

了解MySQL的隱式轉(zhuǎn)化

之所以出現(xiàn)這種情況,是因為 “+” 為算術(shù)操作符arithmetic operator 這樣就可以解釋為什么a和b都轉(zhuǎn)換為double了。因為轉(zhuǎn)換之后其實就是:0+0=0了。

在看一個例子

了解MySQL的隱式轉(zhuǎn)化

現(xiàn)在就看也很好的理解上面的例子了吧。a+b=c結(jié)果為1,1在MySQL中可以理解為TRUE,因為'a'+'b'的結(jié)果為0,c也會隱式轉(zhuǎn)化為0,因此比較其實是:0=0也就是true,也就是1.

第二個需要注意點就是防止多查詢或者刪除數(shù)

了解MySQL的隱式轉(zhuǎn)化

上面的例子本意是查詢id為5的那一條記錄,結(jié)果把id為6的那一條也查詢出來了。我想說明什么情況呢?有時候我們的數(shù)據(jù)庫表中的一些列是varchar類型,但是存儲的值為‘1123’這種的純數(shù)字的字符串值,一些同學(xué)寫sql的時候又不習(xí)慣加引號。這樣當(dāng)進行select,update或者delete的時候就可能會多操作一些數(shù)據(jù)。所以應(yīng)該加引號的地方別忘記了。

關(guān)于字符串轉(zhuǎn)數(shù)字的一些說明

了解MySQL的隱式轉(zhuǎn)化

從上面的例子可以看出,當(dāng)把字符串轉(zhuǎn)為數(shù)字的時候,其實是從左邊開始處理的。

  • 如果字符串的第一個字符就是非數(shù)字的字符,那么轉(zhuǎn)換為數(shù)字就是0
  • 如果字符串以數(shù)字開頭
  • 如果字符串中都是數(shù)字,那么轉(zhuǎn)換為數(shù)字就是整個字符串對應(yīng)的數(shù)字
  • 如果字符串中存在非數(shù)字,那么轉(zhuǎn)換為的數(shù)字就是開頭的那些數(shù)字對應(yīng)的值

分享到:
標(biāo)簽:轉(zhuǎn)化 隱式 MySQL
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定