欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中因一個雙引號錯位引發(fā)的血案詳析

 更新時間:2018年11月22日 16:13:44   作者:Harvey  
這篇文章主要給大家介紹了關于MySQL中因一個雙引號錯位引發(fā)的血案的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、前言

最近經(jīng)常碰到開發(fā)誤刪除誤更新數(shù)據(jù),這不,他們又給我找了個麻煩,我們來看下整個過程。

二、過程

由于開發(fā)需要在生產(chǎn)環(huán)節(jié)中修復數(shù)據(jù),需要執(zhí)行120條SQL語句,需要將數(shù)據(jù)進行更新

于是開發(fā)連上了生產(chǎn)數(shù)據(jù)庫,首先執(zhí)行了第一條SQL

update tablename set source_name = "bj1062-北京市朝陽區(qū)常營北辰福第"
where source_name = "-北京市朝陽區(qū)常營北辰福第"

我們仔細看了下,這個SQL,的確沒有什么問題,where條件也是正常的,大意就是將這個地址的前面加字符串bj1062,是真的沒有錯誤么?是的沒有錯誤。開發(fā)執(zhí)行完成后,結果的確是符合預期。

然后開發(fā)執(zhí)行了剩下的SQL,都是和上面的SQL一樣,將地址進行更新。執(zhí)行完成后,開發(fā)懵逼了,發(fā)現(xiàn)source_name都變成了0,開發(fā)趕緊給我打電話說:

Harvey,我執(zhí)行了update,where條件都是對的,set的值也是對的,但是set后的字段全部都變成了0,你趕緊幫我看看,看看能不能恢復數(shù)據(jù)。

我趕緊登上服務器,查看了這段時間的binlog,發(fā)現(xiàn)了大量的update tablename set source_name=0的語句,利用binlog2sql進行了解析,項目地址:binlog2sql

趕緊和開發(fā)確定了操作的時間點,生成flashback的SQL,進行了數(shù)據(jù)恢復,同時保留現(xiàn)場證據(jù)。

然后對開發(fā)執(zhí)行的SQL進行了check,發(fā)現(xiàn)了幾條很詭異的SQL:

這幾條SQL的引號位置跑到了where 字段名字后面,簡化后的SQL變成了:

update tbl_name set str_col="xxx" = "yyy"

那么這個SQL在MySQL他是如何進行語義轉化的呢?

可能是下面這樣的么?

update tbl_name set (str_col="xxx" )= "yyy"

這樣就語法錯誤了,那么只會是下面這樣的形式,

update tbl_name set str_col=("xxx" = "yyy")

select "xxx" = "yyy"

的值是0,所以

update tbl_name set str_col="xxx" = "yyy"

等價于

update tbl_name set str_col=0

所以就導致了source_name字段全部更新成了0.

我們再研究下select形式這種語句會怎么樣。

mysql [localhost] {msandbox} (test) > select id,str_col from tbl_name where str_col="xxx" = "yyy";
+----+---------+
| id | str_col |
| 1 | aaa |
+----+---------+ | 2 | aaa |
+----+---------+
| 3 | aaa |
| 4 | aaa |

我們發(fā)現(xiàn),這個SQL將str_col='aaa'的記錄也查找出來了,為什么呢?

mysql [localhost] {msandbox} (test) > warnings
Show warnings enabled.
mysql [localhost] {msandbox} (test) > explain extended select id,str_col from tbl_name where str_col="xxx" = "yyy"\G
*************************** 1. row ***************************
id: 1 select_type: SIMPLE table: tbl_name type: index
1 row in set, 1 warning (0.00 sec)
possible_keys: NULL
key: idx_str
ref: NULL
key_len: 33 rows: 4
Extra: Using where; Using index
filtered: 100.00
Note (Code 1003): /* select#1 */ select `test`.`tbl_name`.`id` AS `id`,`test`.`tbl_name`.`str_col` AS `str_col` from `test`.`tbl_name` where ((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy')

這里他把 where 條件轉化成了

((`test`.`tbl_name`.`str_col` = 'xxx') = 'yyy')

這個條件的首先判斷str_col 和'xxx'是否相等,如果相等,那么里面括號的值為1,如果不相等,就是0
然后0或者1再和和'yyy'進行判斷,

由于等號一邊是int,另外一邊是字符串,兩邊都轉化為float進行比較

MySQL中隱式轉換導致的查詢結果錯誤案例分析

‘yyy'轉化為浮點型為0,0和0比較恒等于1

mysql [localhost] {msandbox} (test) > select 'yyy'+0.0;
+-----------+
| 'yyy'+0.0 |
| 0 |
+-----------+
mysql [localhost] {msandbox} (test) > select 0=0;
+-----------+
1 row in set, 1 warning (0.00 sec)
+-----+
1 row in set (0.00 sec)
| 0=0 |
+-----+
+-----+
| 1 |

這樣導致結果恒成立,也就是 select 語句等價于以下 SQL

select id,str_col from tbl_name where 1=1;

將查詢出所有的記錄。

三、小結

在寫SQL的過程中,一定要小心引號的位置是否正確,有時候引號位置錯誤,SQL依然是正常的,但是卻會導致執(zhí)行結果全部錯誤。在執(zhí)行前必須在測試環(huán)境執(zhí)行測試,結合IDE的語法高亮發(fā)現(xiàn)相應的問題。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • MySQL對小數(shù)進行四舍五入的操作實現(xiàn)

    MySQL對小數(shù)進行四舍五入的操作實現(xiàn)

    數(shù)學函數(shù)是MySQL中常用的一類函數(shù),其主要用于處理數(shù)字,包括整型和浮點數(shù)等等,本文主要介紹了MySQL對小數(shù)進行四舍五入的操作實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • MySQL Installer 8.0.21安裝教程圖文詳解

    MySQL Installer 8.0.21安裝教程圖文詳解

    這篇文章主要介紹了MySQL Installer 8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • CentOS下安裝mysql時忘記設置root密碼致無法登錄的解決方法

    CentOS下安裝mysql時忘記設置root密碼致無法登錄的解決方法

    最近在給公司的內(nèi)網(wǎng)開發(fā)用服務器裝系統(tǒng),然后裝mysql居然就花了一天,原因是因為本人在CentOS下安裝萬mysql后,無法通過root進入,因為安裝的時候,并沒有設置root密碼而導致無法登錄,通過查找了資料終于解決了,現(xiàn)在想方法分享給大家,有需要的朋友們可以參考借鑒。
    2016-11-11
  • MySql5.7.11編譯安裝及修改root密碼的方法小結

    MySql5.7.11編譯安裝及修改root密碼的方法小結

    這篇文章主要介紹了MySql5.7.11編譯安裝及修改root密碼的方法小結的相關資料,需要的朋友可以參考下
    2016-04-04
  • MySQL 從一張表update字段到另外一張表中

    MySQL 從一張表update字段到另外一張表中

    使用MySQL 4.0版或更高更新您可以通過加入兩個或多個表一起一表;通過加入兩個表連同您可以更新一個表的記錄在相關領域的總部設在另一個表。
    2015-09-09
  • 登錄mysql數(shù)據(jù)庫的幾種方式

    登錄mysql數(shù)據(jù)庫的幾種方式

    本文主要介紹了登錄mysql數(shù)據(jù)庫的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • MySql8.023安裝過程圖文詳解(首次安裝)

    MySql8.023安裝過程圖文詳解(首次安裝)

    這篇文章主要介紹了MySql8.023安裝過程(首次安裝),本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳解數(shù)據(jù)庫_MySQL: mysql函數(shù)

    詳解數(shù)據(jù)庫_MySQL: mysql函數(shù)

    這篇文章主要介紹了數(shù)據(jù)庫_MySQL: mysql函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • MySQL中批量刪除指定前綴表的sql語句

    MySQL中批量刪除指定前綴表的sql語句

    有時候我們在安裝一些cms的時候,這些cms都是帶表前綴的方便區(qū)分數(shù)據(jù),但有時候我們測試完需要刪除的時候又有別的前綴表就可以參考下面的方法
    2013-06-06
  • Mysql使用函數(shù)json_extract處理Json類型數(shù)據(jù)的方法實例

    Mysql使用函數(shù)json_extract處理Json類型數(shù)據(jù)的方法實例

    在日常業(yè)務開發(fā)中通常mysql數(shù)據(jù)庫中某個字段會需要存儲json格式字符串,下面這篇文章主要給大家介紹了關于Mysql使用函數(shù)json_extract處理Json類型數(shù)據(jù)的相關資料,需要的朋友可以參考下
    2022-09-09

最新評論