1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      如何解決MySQL中因一個雙引號錯位引發(fā)的問題

      小編給大家分享一下如何解決MySQL中因一個雙引號錯位引發(fā)的問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

      創(chuàng)新互聯(lián)擁有網(wǎng)站維護技術(shù)和項目管理團隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站維護、成都二樞服務(wù)器租用托管解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護服務(wù)覆蓋集團企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站制作、政府網(wǎng)站等各類型客戶群體,為全球千余家企業(yè)提供全方位網(wǎng)站維護、服務(wù)器維護解決方案。

      一、前言

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

      二、過程

      由于開發(fā)需要在生產(chǎn)環(huán)節(jié)中修復(fù)數(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ū)常營北辰福第"

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

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

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

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

      如何解決MySQL中因一個雙引號錯位引發(fā)的問題

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

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

      如何解決MySQL中因一個雙引號錯位引發(fā)的問題

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

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

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

      可能是下面這樣的么?

      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

      所以就導(dǎo)致了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 條件轉(zhuǎn)化成了

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

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

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

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

      ‘yyy'轉(zhuǎ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 語句等價于以下 SQL

      select id,str_col from tbl_name where 1=1;

      將查詢出所有的記錄。

      以上是“如何解決MySQL中因一個雙引號錯位引發(fā)的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


      分享標(biāo)題:如何解決MySQL中因一個雙引號錯位引發(fā)的問題
      瀏覽地址:http://www.ef60e0e.cn/article/pihcsc.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        乌拉特前旗| 安阳市| 上杭县| 宁武县| 甘泉县| 兰溪市| 若尔盖县| 临城县| 益阳市| 工布江达县| 九江县| 荥经县| 渝北区| 闽清县| 荆州市| 县级市| 清徐县| 双辽市| 合山市| 张家口市| 惠州市| 南开区| 蛟河市| 洪江市| 林周县| 佳木斯市| 顺昌县| 个旧市| 全南县| 岳普湖县| 延川县| 宣化县| 安岳县| 库车县| 阳西县| 华容县| 荃湾区| 铜梁县| 德钦县| 齐齐哈尔市| 固镇县|