国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Mysql - MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析

MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析

2019-06-15 11:11Harvey Mysql

這篇文章主要給大家介紹了關(guān)于MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

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

二、過(guò)程

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

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

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

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

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

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

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

MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析

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

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

MySQL中因一個(gè)雙引號(hào)錯(cuò)位引發(fā)的血案詳析

這幾條SQL的引號(hào)位置跑到了where 字段名字后面,簡(jiǎn)化后的SQL變成了:

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

那么這個(gè)SQL在MySQL他是如何進(jìn)行語(yǔ)義轉(zhuǎn)化的呢?

可能是下面這樣的么?

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

這樣就語(yǔ)法錯(cuò)誤了,那么只會(huì)是下面這樣的形式,

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

select "xxx" = "yyy"

的值是0,所以

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

等價(jià)于

update tbl_name set str_col=0

所以就導(dǎo)致了source_name字段全部更新成了0.

我們?cè)傺芯肯聅elect形式這種語(yǔ)句會(huì)怎么樣。

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),這個(gè)SQL將str_col='aaa'的記錄也查找出來(lái)了,為什么呢?

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 條件轉(zhuǎn)化成了

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

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

由于等號(hào)一邊是int,另外一邊是字符串,兩邊都轉(zhuǎn)化為float進(jìn)行比較

MySQL中隱式轉(zhuǎn)換導(dǎo)致的查詢結(jié)果錯(cuò)誤案例分析

‘yyy'轉(zhuǎn)化為浮點(diǎn)型為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 |

這樣導(dǎo)致結(jié)果恒成立,也就是 select 語(yǔ)句等價(jià)于以下 SQL

select id,str_col from tbl_name where 1=1;

將查詢出所有的記錄。

三、小結(jié)

在寫(xiě)SQL的過(guò)程中,一定要小心引號(hào)的位置是否正確,有時(shí)候引號(hào)位置錯(cuò)誤,SQL依然是正常的,但是卻會(huì)導(dǎo)致執(zhí)行結(jié)果全部錯(cuò)誤。在執(zhí)行前必須在測(cè)試環(huán)境執(zhí)行測(cè)試,結(jié)合IDE的語(yǔ)法高亮發(fā)現(xiàn)相應(yīng)的問(wèn)題。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 91高清视频在线观看 | 久操视频在线 | 亚洲第一成人久久网站 | 欧美亚洲视频在线观看 | 日韩av资源网 | 久久久网站 | 国产精品一二区 | av黄色在线免费观看 | 亚洲国产区 | 亚洲一区二区三区高清 | 一级毛片视频 | 欧美午夜一区二区三区免费大片 | 日韩在线电影 | 国产精品视频 | 玖玖精品 | 精品在线播放 | 欧美一区二区三区久久精品 | 综合伊人久久 | 国产高清精品一区二区三区 | 先锋av资源在线 | 亚洲一区中文字幕在线观看 | 免费成人在线视频观看 | 久久噜噜噜精品国产亚洲综合 | 色视频免费在线 | 亚洲男人天堂2018 | 午夜视频 | 精品三级三级三级三级三级 | 免费一级欧美在线观看视频 | 国产韩国精品一区二区三区 | 欧美日韩中文在线 | 久久久精品日韩 | 黄色最新网站 | 日韩视频在线一区二区 | 国产欧美日韩综合精品一区二区 | 亚洲精品视频免费观看 | 欧美日韩一区精品 | 国产一区二区三区四区hd | 亚洲一级片av | 国产精品久久久久久久久久久久久久久久 | 依人在线 | 日韩国产在线 |