色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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

    文章

    9233

    瀏覽量

    85638
  • SQL
    SQL
    +關注

    關注

    1

    文章

    768

    瀏覽量

    44175

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    淺談SQL優化小技巧

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

    本地LabVIEW訪問遠程mysql

    SQL SERVER我也嘗試過,連接字符串中寫入遠程訪問對象的IP就可以。可是MYSQL這個數據庫沒用過,更沒用LabVIEW對其進行過訪問操作,而且還是遠程訪問。。。現在的情況是,
    發表于 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 ?1616次閱讀

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

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

    SQL Server與MySQL差異

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

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

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

    將外部sql文件導入MySQL步驟

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

    mysqlsql server區別

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

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

    (1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將 SQL 語句進行解析,并生成
    的頭像 發表于 12-12 10:19 ?418次閱讀
    <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 ?591次閱讀
    查詢<b class='flag-5'>SQL</b><b class='flag-5'>在</b><b class='flag-5'>mysql</b>內部是如何執行?
    主站蜘蛛池模板: 亚洲精品成人a在线观看| 一本久道久久综合婷婷五月| 绿巨人www在线观看| 麻豆啊传媒app黄版破解免费| 凌馨baby| 欧美日韩高清一区| 日本高清免费一本视频在线观看| 日本枯瘦娇小| 特大巨黑人吊性xxxxgay| 亚洲qingse中文字幕久久| 伊人久久综在合线亚洲| 99精品视频在线| 动漫美女禁区图| 国产亚洲欧洲日韩在线观看| 精品国产成a人在线观看| 久久综合老色鬼网站| 欧美高清vivoesosexo18| 色综合久久88一加勒比 | oldgrand欧洲老妇人| 古代荡女丫鬟高H辣文纯肉| 国产午夜不卡| 久久综合久久鬼| 日本又黄又爽又色又刺激的视频| 小鸟酱喷水| 67194线在线精品观看| 东北疯狂xxxxbbbb中国| 好紧小嫩嫩水的10p| 免费观看桶机十分钟| 日日噜噜噜夜夜爽爽狠狠图片| 亚洲AV久久久噜噜噜噜| 4399亚洲AV无码V无码网站 | 日韩美一区二区| 亚洲免费视频网站| 99热这里只有的精品| 国产精品无码麻豆放荡AV| 久久国产av偷拍在线| 日本久久网站| 伊人国产在线视频| 超碰99热在线精品视频| 护士12p| 欧美一区二区视频97色伦|