在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

電子工程師 ? 來(lái)源:李倩 ? 2018-11-29 14:24 ? 次閱讀

一、前言

最近經(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

updatetablenamesetsource_name="bj1062-北京市朝陽(yáng)區(qū)常營(yíng)北辰福第"wheresource_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)目地址:

binlog2sqlhttps://github.com/danfengcao/binlog2sql

趕緊和開(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

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

updatetbl_namesetstr_col="xxx"="yyy"

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

可能是下面這樣的么?

updatetbl_nameset(str_col="xxx")="yyy"

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

updatetbl_namesetstr_col=("xxx"="yyy")

select"xxx"="yyy"

的值是0,所以

updatetbl_namesetstr_col="xxx"="yyy"

等價(jià)于

updatetbl_namesetstr_col=0

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

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

mysql[localhost]{msandbox}(test)>selectid,str_colfromtbl_namewherestr_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)>warningsShowwarningsenabled.mysql[localhost]{msandbox}(test)>explainextendedselectid,str_colfromtbl_namewherestr_col="xxx"="yyy"\G***************************1.row***************************id:1select_type:SIMPLEtable:tbl_nametype:indexpossible_keys:NULLkey:idx_strkey_len:33ref:NULLrows:4filtered:100.00Extra:Usingwhere;Usingindex1rowinset,1warning(0.00sec)Note(Code1003):/*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ò)誤案例分析http://www.fordba.com/mysql-type-convert-analysis.html'yyy'轉(zhuǎn)化為浮點(diǎn)型為0,0和0比較恒等于1

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

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

selectid,str_colfromtbl_namewhere1=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)題。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9308

    瀏覽量

    86071
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    775

    瀏覽量

    44254

原文標(biāo)題:MySQL 中一個(gè)雙引號(hào)的錯(cuò)位引發(fā)的血案

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MySQL的執(zhí)行過(guò)程 SQL語(yǔ)句性能優(yōu)化常用策略

    回顧 MySQL 的執(zhí)行過(guò)程,幫助介紹如何進(jìn)行 sql 優(yōu)化。
    的頭像 發(fā)表于 12-12 10:26 ?714次閱讀
    <b class='flag-5'>MySQL</b>的執(zhí)行過(guò)程 <b class='flag-5'>SQL</b>語(yǔ)句性能優(yōu)化常用策略

    淺談SQL優(yōu)化小技巧

    作者:京東零售 王軍 回顧:MySQL的執(zhí)行過(guò)程回顧 MySQL的執(zhí)行過(guò)程,幫助 介紹 如何進(jìn)行sql優(yōu)化。 (1)客戶端發(fā)送一條查詢語(yǔ)句到服務(wù)器; (2)服務(wù)器先查詢緩存,如果命中緩
    的頭像 發(fā)表于 12-25 09:59 ?580次閱讀

    本地LabVIEW訪問(wèn)遠(yuǎn)程mysql

    SQL SERVER我也嘗試過(guò),連接字符串中寫(xiě)入遠(yuǎn)程訪問(wèn)對(duì)象的IP就可以。可是MYSQL這個(gè)數(shù)據(jù)庫(kù)沒(méi)用過(guò),更沒(méi)用LabVIEW對(duì)其進(jìn)行過(guò)訪問(wèn)操作,而且還是遠(yuǎn)程訪問(wèn)。。。現(xiàn)在的情況是,
    發(fā)表于 12-15 14:38

    MySQL數(shù)據(jù)庫(kù)Access存儲(chǔ)讀取SQL語(yǔ)句

    LabVIEW視頻教程MySQL數(shù)據(jù)庫(kù)Access存儲(chǔ)讀取SQL語(yǔ)句
    發(fā)表于 10-21 11:59

    一文讀懂SQL Server和MySQL的區(qū)別

    SQL Server和MySQL的區(qū)別主要體現(xiàn)在下面這些方面: 一、本質(zhì)區(qū)別是它們所遵循的基本原則 二、發(fā)行費(fèi)用上:MySQL不全是免費(fèi),但很便宜 三、性能方面:先進(jìn)的MySQL
    發(fā)表于 09-28 11:29 ?8.3w次閱讀

    PHP與MYSQL數(shù)據(jù)庫(kù)如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是PHP與MYSQL數(shù)據(jù)庫(kù)如何進(jìn)行交互詳細(xì)方法實(shí)驗(yàn)說(shuō)明。一、【實(shí)驗(yàn)?zāi)康摹?. 掌握PHP提供的各種函數(shù)與MYSQL數(shù)據(jù)庫(kù)進(jìn)行交互的方法。2. 掌握數(shù)據(jù)庫(kù)操作類(lèi)
    發(fā)表于 06-13 16:58 ?13次下載

    Linux系統(tǒng)下執(zhí)行MySQLSQL文件程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Linux系統(tǒng)下執(zhí)行MySQLSQL文件程序免費(fèi)下載。
    發(fā)表于 11-01 17:29 ?4次下載

    MySQL索引的使用問(wèn)題

    一、前言 MySQL進(jìn)行SQL優(yōu)化的時(shí)候,經(jīng)常會(huì)在一些情況下,對(duì)MySQL能否利用索引有一些迷惑。譬如:1、
    的頭像 發(fā)表于 01-06 16:13 ?1640次閱讀

    深入探索SQL Server與MySQL的性能和特性

    MySQLSQL Server有許多相似之處,但它們也有明顯的區(qū)別。它們之間進(jìn)行選擇時(shí),必須考慮每個(gè)系統(tǒng)的優(yōu)缺點(diǎn)。
    的頭像 發(fā)表于 05-09 17:31 ?2295次閱讀

    SQL Server與MySQL差異

    雖然SQLServer和MySQL都使用SQL作為其基礎(chǔ)語(yǔ)言,但它們使用不同的方言。這兩個(gè)平臺(tái)的語(yǔ)言約定不同,這使得為MySQL和SQLServer編寫(xiě)相同的代碼變得不可行。因此,開(kāi)發(fā)人員需要熟悉每個(gè)平臺(tái)的特定規(guī)則,并相應(yīng)地調(diào)整
    的頭像 發(fā)表于 05-12 14:49 ?1719次閱讀

    mysql數(shù)據(jù)庫(kù)的增刪改查sql語(yǔ)句

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),是許多網(wǎng)站和應(yīng)用程序的首選數(shù)據(jù)庫(kù)。MySQL中,我們可以使用SQL(結(jié)構(gòu)化查詢語(yǔ)言)進(jìn)行數(shù)據(jù)的
    的頭像 發(fā)表于 11-16 15:41 ?1325次閱讀

    將外部sql文件導(dǎo)入MySQL步驟

    將外部sql文件導(dǎo)入MySQL是一項(xiàng)非常常見(jiàn)的操作,它允許我們將事先準(zhǔn)備好的數(shù)據(jù)或數(shù)據(jù)庫(kù)結(jié)構(gòu)導(dǎo)入到MySQL數(shù)據(jù)庫(kù)中。本文將詳細(xì)介紹該過(guò)程的步驟,并提供一些實(shí)用的技巧和注意事項(xiàng)。 開(kāi)
    的頭像 發(fā)表于 11-21 11:00 ?1721次閱讀

    mysqlsql server區(qū)別

    MySQLSQL Server是兩種常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),用于存儲(chǔ)和管理數(shù)據(jù)庫(kù)。雖然它們都支持SQL語(yǔ)言,但在其他方面存在一些顯著的區(qū)別。以下是MySQL
    的頭像 發(fā)表于 11-21 11:07 ?1594次閱讀

    MySQL執(zhí)行過(guò)程:如何進(jìn)行sql 優(yōu)化

    (1)客戶端發(fā)送一條查詢語(yǔ)句到服務(wù)器; (2)服務(wù)器先查詢緩存,如果命中緩存,則立即返回存儲(chǔ)緩存中的數(shù)據(jù); (3)未命中緩存后,MySQL 通過(guò)關(guān)鍵字將 SQL 語(yǔ)句進(jìn)行解析,并生成
    的頭像 發(fā)表于 12-12 10:19 ?451次閱讀
    <b class='flag-5'>MySQL</b>執(zhí)行過(guò)程:如<b class='flag-5'>何進(jìn)行</b><b class='flag-5'>sql</b> 優(yōu)化

    查詢SQLmysql內(nèi)部是如何執(zhí)行?

    我們知道mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結(jié)果。這條查詢語(yǔ)句 MySQL 內(nèi)部到底是如何執(zhí)行的
    的頭像 發(fā)表于 01-22 14:53 ?634次閱讀
    查詢<b class='flag-5'>SQL</b><b class='flag-5'>在</b><b class='flag-5'>mysql</b>內(nèi)部是如何執(zhí)行?
    主站蜘蛛池模板: 国产老头和美女在线观看 | 一级毛片真人免费观看 | 色多多视频成人影院 | tom影院亚洲国产 | 大学生一级特黄的免费大片视频 | 香蕉视频久久久 | 久久久午夜精品 | 日韩免费三级电影 | 国产在线美女 | 四虎影永久在线观看网址 | 国产欧美乱码在线看 | 五月综合色 | h网站亚洲 | swag系列国产精品 | 男女交性视频播放视频视频 | 四虎影院在线免费播放 | 一区二区三区亚洲视频 | 国产毛片农村妇女系列 | 国产免费好大好硬视频 | 天堂资源8中文最新版在线 天堂资源地址在线 | 久久99热狠狠色精品一区 | 9984四虎永久免费网站 | 久久这里只精品热在线8 | 日韩一级片视频 | 天堂网最新 | 操久在线 | 精品国产免费人成高清 | 日本一区二区精品88 | 色综合天天综合网看在线影院 | 一级网站在线观看 | 色视频国产 | 91大神精品| 免费看污黄视频软件 | 欧美国产精品主播一区 | 黄色大片免费观看 | 欧美成人伊人十综合色 | 色老头久久久久 | 欧美人与zoxxxx另类 | 色在线视频网站 | 侵犯希崎中文字幕在线 | 免费看黄色片网站 |