mysql中隱式轉換 了解MySQL的隱式轉化

2021-10-20 01:34:13 字數 1869 閱讀 1235

在mysql中。當我們對不同型別的值進行比較的時候,為了使得這些數值「可比較」(也可以稱為型別的相容性),mysql會做一些隱式轉化(implicit type conversion)。那麼什麼是「隱式轉換」呢?讓我們一起來了解一下吧!

當我們對不同型別的值進行比較的時候,為了使得這些數值「可比較」(也可以稱為型別的相容性),mysql會做一些隱式轉化(implicit type conversion)。比如下面的例子:

很明顯,上面的sql語句的執行過程中就出現了隱式轉化。並且從結果們可以判斷出,第一條sql中,將字串的「1」轉換為數字1,而在第二條的sql中,將數字2轉換為字串「2」。

mysql也提供了cast()函式。我們可以使用它明確的把數值轉換為字串。當使用conca()函式的時候,也可能會出現隱式轉化,因為它希望的引數為字串形式,但是如果我們傳遞的不是字串呢:

隱式轉化規則

官方文件中關於隱式轉化的規則是如下描述的:

翻譯為中文就是:兩個引數至少有乙個是 null 時,比較的結果也是 null,例外是使用 <=> 對兩個 null 做比較時會返回 1,這兩種情況都不需要做型別轉換

兩個引數都是字串,會按照字串來比較,不做型別轉換

兩個引數都是整數,按照整數來比較,不做型別轉換

十六進製制的值和非數字做比較時,會被當做二進位制串

有乙個引數是 timestamp 或 datetime,並且另外乙個引數是常量,常量會被轉換為 timestamp

有乙個引數是 decimal 型別,如果另外乙個引數是 decimal 或者整數,會將整數轉換為 decimal 後進行比較,如果另外乙個引數是浮點數,則會把 decimal 轉換為浮點數進行比較

所有其他情況下,兩個引數都會被轉換為浮點數再進行比較

注意點安全問題:假如 password 型別為字串,查詢條件為 int 0 則會匹配上。

相信上面的例子,一些機靈的同學可以發現其實上面的例子也可以做sql注入。

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

之所以出現上述的原因是因為:

下面通過一些例子來複習一下上面的轉換規則:

把字串「aa」和1進行求和,得到1,因為「aa」和數字1的型別不同,mysql官方文件告訴我們:

檢視warnings可以看到隱式轉化把字串轉為了double型別。但是因為字串是非數字型的,所以就會被轉換為0,因此最終計算的是0+1=1

上面的例子是型別不同,所以出現了隱式轉化,那麼如果我們使用相同型別的值進行運算呢?

之所以出現這種情況,是因為 「+」 為算術操作符arithmetic operator 這樣就可以解釋為什麼a和b都轉換為double了。因為轉換之後其實就是:0+0=0了。

在看乙個例子:

現在就看也很好的理解上面的例子了吧。a+b=c結果為1,1在mysql中可以理解為true,因為'a'+'b'的結果為0,c也會隱式轉化為0,因此比較其實是:0=0也就是true,也就是1.

第二個需要注意點就是防止多查詢或者刪除資料

上面的例子本意是查詢id為5的那一條記錄,結果把id為6的那一條也查詢出來了。我想說明什麼情況呢?有時候我們的資料庫表中的一些列是varchar型別,但是儲存的值為『1123』這種的純數字的字串值,一些同學寫sql的時候又不習慣加引號。這樣當進行select,update或者delete的時候就可能會多操作一些資料。所以應該加引號的地方別忘記了。

關於字串轉數字的一些說明

從上面的例子可以看出,當把字串轉為數字的時候,其實是從左邊開始處理的。如果字串的第乙個字元就是非數字的字元,那麼轉換為數字就是0

如果字串以數字開頭

如果字串中都是數字,那麼轉換為數字就是整個字串對應的數字

如果字串中存在非數字,那麼轉換為的數字就是開頭的那些數字對應的值

mysql 隱式轉換 mysql中的隱式轉換

在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引。下面分析兩種隱式轉換的情況 看表結構 phone為 int型別,name為 varchar 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但...

mysql 關閉隱式轉換 Mysql中的隱式轉換

在mysql查詢中,當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,可能導致查詢無法使用索引,下面分析兩種隱式轉換的情況看表結構phone為int型別,name為varchar型別 兩種情況都可以用到索引,這次等號右側是 2 注意帶單引號喲,左側的索引欄位是int型別,因此也會發生隱式轉換,但因為...

mysql日期隱式轉換 mysql中的隱式轉換

什麼隱式型別轉換?在mysql中 當操作符與不同型別的運算元一起使用時,會發生型別轉換以使運算元相容。則會發生轉換隱式 也就是說,mysql會根據需要自動將數字轉換為字串,將字串轉換數字。看到這個概念之後,是不是有一種茅塞頓開的感覺。哦.原來在資料結構中telephone欄位為字串 varchar ...