mysql 轉數字 了解MySQL的隱式轉化

2021-10-18 08:14:41 字數 2145 閱讀 4459

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

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

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

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

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

翻譯為中文就是:

安全問題:假如 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的時候就可能會多操作一些資料。所以應該加引號的地方別忘記了。

從上面的例子可以看出,當把字串轉為數字的時候,其實是從左邊開始處理的。

MySQL基礎之了解MySQL

資料庫是乙個以某種有組織的方式儲存的資料集合。可以將資料庫理解為乙個檔案櫃,此檔案櫃是乙個存放資料的物理位置,不管資料是什麼以及如何組織的 資料庫 database 儲存有組織的資料的容器 通常是乙個檔案或一組檔案 資料庫並不代表通常使用的資料庫軟體 資料庫軟體應該稱為dbms 資料庫管理系統 資料...

MySQL許可權了解

一 mysql許可權檢查原理 1 檢查使用者是否有許可權連線到伺服器 判斷依據 1 你從哪來 host 2 你是誰 username 3 密碼 password 使用者的這三條資訊儲存在mysql庫下的user表中 可以通過修改user表中的資料,更改這些資訊如 修改host update user...

MySQL簡單了解

在學習sql注入之前我們需要先了解下資料庫,這裡我們已mysql資料庫為例進行講解,在學習注入之前,我們先了解下mysql資料庫的特性,mysql資料庫裡預設的資料庫有4個,如下圖所示 先講一下這4個預設的資料庫的作用 1 infromation schema information schema是...