色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

一、前言

最近經常碰到開發誤刪除誤更新數據,這不,他們又給我找了個麻煩,我們來看下整個過程。

二、過程

由于開發需要在生產環節中修復數據,需要執行120條SQL語句,需要將數據進行更新

于是開發連上了生產數據庫,首先執行了第一條SQL

updatetablenamesetsource_name="bj1062-北京市朝陽區常營北辰福第"wheresource_name="-北京市朝陽區常營北辰福第"

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

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

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

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

binlog2sqlhttps://github.com/danfengcao/binlog2sql

趕緊和開發確定了操作的時間點,生成flashback的SQL,進行了數據恢復,同時保留現場證據。

然后對開發執行的SQL進行了check,發現了幾條很詭異的SQL

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

updatetbl_namesetstr_col="xxx"="yyy"

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

可能是下面這樣的么?

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

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

updatetbl_namesetstr_col=("xxx"="yyy")

select"xxx"="yyy"

的值是0,所以

updatetbl_namesetstr_col="xxx"="yyy"

等價于

updatetbl_namesetstr_col=0

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

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

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

我們發現,這個SQL將str_col='aaa'的記錄也查找出來了,為什么呢?

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條件轉化成了

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

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

然后0或者1再和和'yyy'進行判斷,由于等號一邊是int,另外一邊是字符串,兩邊都轉化為float進行比較,可以看我之前的一篇文章MySQL中隱式轉換導致的查詢結果錯誤案例分析http://www.fordba.com/mysql-type-convert-analysis.html'yyy'轉化為浮點型為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)

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

selectid,str_colfromtbl_namewhere1=1;

將查詢出所有的記錄。

三、小結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9295

    瀏覽量

    85926
  • SQL
    SQL
    +關注

    關注

    1

    文章

    773

    瀏覽量

    44228

原文標題:MySQL 中一個雙引號的錯位引發的血案

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MySQL的執行過程 SQL語句性能優化常用策略

    回顧 MySQL 的執行過程,幫助介紹如何進行 sql 優化。
    的頭像 發表于 12-12 10:26 ?710次閱讀
    <b class='flag-5'>MySQL</b>的執行過程 <b class='flag-5'>SQL</b>語句性能優化常用策略

    淺談SQL優化小技巧

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

    本地LabVIEW訪問遠程mysql

    SQL SERVER我也嘗試過,連接字符串中寫入遠程訪問對象的IP就可以??墒?b class='flag-5'>MYSQL這個數據庫沒用過,更沒用LabVIEW對其進行過訪問操作,而且還是遠程訪問。?!,F在的情況是,
    發表于 12-15 14:38

    MySQL數據庫Access存儲讀取SQL語句

    LabVIEW視頻教程MySQL數據庫Access存儲讀取SQL語句
    發表于 10-21 11:59

    一文讀懂SQL Server和MySQL的區別

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

    PHP與MYSQL數據庫如何進行交互詳細方法實驗說明

    本文檔的主要內容詳細介紹的是PHP與MYSQL數據庫如何進行交互詳細方法實驗說明。一、【實驗目的】1. 掌握PHP提供的各種函數與MYSQL數據庫進行交互的方法。2. 掌握數據庫操作類
    發表于 06-13 16:58 ?13次下載

    Linux系統下執行MySQLSQL文件程序免費下載

    本文檔的主要內容詳細介紹的是Linux系統下執行MySQLSQL文件程序免費下載。
    發表于 11-01 17:29 ?4次下載

    MySQL索引的使用問題

    一、前言 MySQL進行SQL優化的時候,經常會在一些情況下,對MySQL能否利用索引有一些迷惑。譬如:1、
    的頭像 發表于 01-06 16:13 ?1635次閱讀

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

    MySQLSQL Server有許多相似之處,但它們也有明顯的區別。它們之間進行選擇時,必須考慮每個系統的優缺點。
    的頭像 發表于 05-09 17:31 ?2284次閱讀

    SQL Server與MySQL差異

    雖然SQLServer和MySQL都使用SQL作為其基礎語言,但它們使用不同的方言。這兩個平臺的語言約定不同,這使得為MySQL和SQLServer編寫相同的代碼變得不可行。因此,開發人員需要熟悉每個平臺的特定規則,并相應地調整
    的頭像 發表于 05-12 14:49 ?1710次閱讀

    mysql數據庫的增刪改查sql語句

    MySQL是一種常用的關系型數據庫管理系統,是許多網站和應用程序的首選數據庫。MySQL中,我們可以使用SQL(結構化查詢語言)進行數據的
    的頭像 發表于 11-16 15:41 ?1320次閱讀

    將外部sql文件導入MySQL步驟

    將外部sql文件導入MySQL是一項非常常見的操作,它允許我們將事先準備好的數據或數據庫結構導入到MySQL數據庫中。本文將詳細介紹該過程的步驟,并提供一些實用的技巧和注意事項。
    的頭像 發表于 11-21 11:00 ?1706次閱讀

    mysqlsql server區別

    MySQLSQL Server是兩種常見的關系型數據庫管理系統(RDBMS),用于存儲和管理數據庫。雖然它們都支持SQL語言,但在其他方面存在一些顯著的區別。以下是MySQL
    的頭像 發表于 11-21 11:07 ?1581次閱讀

    MySQL執行過程:如何進行sql 優化

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

    查詢SQLmysql內部是如何執行?

    我們知道mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句 MySQL 內部到底是如何執行的
    的頭像 發表于 01-22 14:53 ?626次閱讀
    查詢<b class='flag-5'>SQL</b><b class='flag-5'>在</b><b class='flag-5'>mysql</b>內部是如何執行?
    主站蜘蛛池模板: 亚洲AV无码久久流水呻蜜桃久色 | 渔夫床满艳史bd高清在线直播 | 色哦色哦哦色天天综合 | 伊人久久国产免费观看视频 | 亚洲AV色香蕉一区二区三区 | 日日噜噜噜夜夜爽爽狠狠图片 | 亚洲免费一区 | 国产成A人片在线观看 | 三级黄视频 | 97在线视频免费人妻 | 亚洲熟妇AV乱码在线观看 | 国产精品成人网 | 国产亚洲精品久久久久久线投注 | 大陆极品少妇内射AAAAAA | vidosgratis tv少女 | 玉林天天论坛 | 亚洲1区2区3区精华液 | 亚洲电影成人 成人影院 | 色婷婷AV国产精品欧美毛片 | 人妻免费久久久久久久了 | 被黑人做的白浆直流 | 性色AV一区二区三区咪爱四虎 | 性饥渴姓交HDSEX | 国产AV亚洲一区精午夜麻豆 | 九九热久久只有精品2 | 动漫女主被扒开双腿羞辱 | 亚洲精品第二页 | 精品国产在线亚洲欧美 | 亚洲视频一 | 美丽的姑娘BD在线观看 | 日韩在线看片中文字幕不卡 | 久久国产免费一区二区三区 | 欧美日韩亚洲一区二区三区在线观看 | 大学生高潮无套内谢视频 | 亚洲综合AV色婷婷五月蜜臀 | 亚洲中文字幕日产乱码2020 | 成人在线视频播放 | 亚洲AV成人片色在线观看网站 | 多肉np一女多男高h爽文现代 | 纲手胸被爆羞羞免费 | 4399日本电影完整版在线观看免费 |