<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL 中的反斜杠 \\,真是太坑了!!

          共 3369字,需瀏覽 7分鐘

           ·

          2022-01-22 08:31

          上一篇:Maven官宣:干掉Maven和Gradle!推出更強(qiáng)更快更牛逼的新一代構(gòu)建工具,炸裂!

          作者:_陳哈哈

          來源:blog.csdn.net/qq_39390545/article/details/117296607


          在MySQL中有很多特殊符號(hào)都是相當(dāng)惡心的,比如字符串中有單引號(hào)(')、雙引號(hào)(")、反斜杠(\)等等,同學(xué)們可以先腦補(bǔ)一下可能會(huì)出現(xiàn)啥問題?

          在我們平時(shí)操作SQL中,一不注意這些符號(hào)就會(huì)給你背上一口鍋。

          你還別不信,聽一句勸,這里的水很深,有些東西,你把握不住…《潘嘎之交》


          INSERT語句中有反斜杠(\)


          1、實(shí)際測(cè)試


          咱們用下面這些SQL來測(cè)試一下反斜杠(\)在INSERT語句中會(huì)是啥樣?


          INSERT INTO `demo0526` (`id`, `text`) VALUES (null, 'D:\陳哈哈\加班');INSERT INTO `demo0526` (`id`, `text`) VALUES (null, 'D:\\陳哈哈\\加班');INSERT INTO `demo0526` (`id`, `text`) VALUES (null, 'D:\\\陳哈哈\\\加班');INSERT INTO `demo0526` (`id`, `text`) VALUES (null, 'D:\\\\陳哈哈\\\\加班');INSERT INTO `demo0526` (`id`, `text`) VALUES (null, 'D:\\\\\陳哈哈\\\\\加班');


          插入后的結(jié)果:


          mysql> select * from demo0526;+----+-----------------------+| id | text                  |+----+-----------------------+|  1 | D:陳哈哈加班          ||  2 | D:\陳哈哈\加班        ||  3 | D:\陳哈哈\加班        ||  4 | D:\\陳哈哈\\加班      ||  5 | D:\\陳哈哈\\加班      |+----+-----------------------+5 rows in set (0.00 sec)


          我們發(fā)現(xiàn)結(jié)果如下:
          當(dāng)字符串中有1個(gè)反斜杠,插入后算0個(gè)。當(dāng)字符串中有2個(gè)反斜杠,插入后算1個(gè)。當(dāng)字符串中有3個(gè)反斜杠,插入后算1個(gè)。當(dāng)字符串中有4個(gè)反斜杠,插入后算2個(gè)。當(dāng)字符串中有5個(gè)反斜杠,插入后算2個(gè)。


          2、是啥原理?


          后來發(fā)現(xiàn),原因其實(shí)很簡(jiǎn)單,在MySQL中,反斜杠在字符串中是屬于轉(zhuǎn)義字符,經(jīng)過語法解析器解析時(shí)會(huì)進(jìn)行一次轉(zhuǎn)義,所以當(dāng)我們insert反斜杠(\)字符時(shí),如 insert “\” 在數(shù)據(jù)庫中最終只會(huì)存儲(chǔ)"",第一個(gè)反斜杠(\)被當(dāng)做轉(zhuǎn)義字符處理。
          同理,像這種 D:\\\陳哈哈\\\加班 字符串,語法解析器解析到第三個(gè)反斜杠(\)時(shí),又會(huì)把它當(dāng)做下一個(gè)轉(zhuǎn)義字符進(jìn)行處理,因此D:\\\陳哈哈\\\加班入庫后變成了D:\陳哈哈\加班。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù)“2T”,獲取一份驚喜禮包。
          所以我們?cè)诖a中處理插入語句碰到反斜杠時(shí),注意\是否已經(jīng)改成\\,否則入庫后字符串會(huì)不一致。


          SELECT查詢反斜杠(\)


          1、實(shí)際測(cè)試


          我們還是沿用上面的表數(shù)據(jù),直接用like模糊匹配來測(cè)試一下。

          mysql> select * from demo0526;+----+-----------------------+| id | text                  |+----+-----------------------+|  1 | D:陳哈哈加班          ||  2 | D:\陳哈哈\加班        ||  3 | D:\陳哈哈\加班        ||  4 | D:\\陳哈哈\\加班      ||  5 | D:\\陳哈哈\\加班      |+----+-----------------------+5 rows in set (0.00 sec)


          我們先用單個(gè)反斜杠和兩個(gè)反斜杠看看能查到啥玩意兒
          mysql> SELECT * from demo0526 where text like '%\%';Empty set (0.00 sec)
          mysql> SELECT * from demo0526 where text like '%\\%';Empty set (0.00 sec)


          啊?。∥覀冇胠ike '%\%'、like '%\\%'查詢后發(fā)現(xiàn)都查不到數(shù)據(jù),納尼?上面的我白學(xué)了嗎?
          別著急,我會(huì)告訴你SELECT語句中四個(gè)反斜杠(\\\\)代表一個(gè)么?呀,我趕快換成like '%\\\\%'試一試。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù)“2T”,獲取一份驚喜禮包。


          mysql> SELECT * from demo0526 where text like '%\\\\%';+----+-----------------------+| id | text                  |+----+-----------------------+|  2 | D:\陳哈哈\加班        ||  3 | D:\陳哈哈\加班        ||  4 | D:\\陳哈哈\\加班      ||  5 | D:\\陳哈哈\\加班      |+----+-----------------------+4 rows in set (0.00 sec)


          喔?那我如果查詢表中帶有兩個(gè)反斜杠(\\)的數(shù)據(jù),豈不是要like八個(gè)。。。。別攔我,我看看tm是誰設(shè)計(jì)的這規(guī)則。


          mysql> SELECT * from demo0526 where text like '%\\\\\\\\%';+----+-----------------------+| id | text                  |+----+-----------------------+|  4 | D:\\陳哈哈\\加班      ||  5 | D:\\陳哈哈\\加班      |+----+-----------------------+2 rows in set (0.00 sec)


          2、又是啥原理?


          原來在mysql的like語法中,like后邊的字符串除了會(huì)在語法解析時(shí)轉(zhuǎn)義一次外,還會(huì)在正則匹配時(shí)進(jìn)行第二次的轉(zhuǎn)義。因此如果期望最終匹配到"",就要反轉(zhuǎn)義兩次,也就是由"\\\\"到"\\"再到"\"。
          如果是普通的精確查詢(=),則無需第二次的正則轉(zhuǎn)義,和INSERT語句一樣。


          mysql> SELECT * from demo0526 where text = '\\\\';+----+------+| id | text |+----+------+|  7 | \\   |+----+------+1 row in set (0.00 sec)


          總結(jié)


          好了,看到這里同學(xué)們有什么感受呢?是不是發(fā)現(xiàn)MySQL中還是存在很多不方便的語法,進(jìn)步空間還很大呀~~
          在日常工作中,也會(huì)經(jīng)常碰到這種符號(hào)引發(fā)的問題,尤其是用戶在界面填寫的數(shù)據(jù),建議要做相關(guān)限定,明確哪些符號(hào)不允許。感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
          ??? · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.心態(tài)崩了!稅前2萬4,到手1萬4,年終獎(jiǎng)扣稅方式1月1日起施行~

          2.深圳一普通中學(xué)老師工資單曝光,秒殺程序員,網(wǎng)友:敢問是哪個(gè)學(xué)校畢業(yè)的?

          3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.清華大學(xué):2021 元宇宙研究報(bào)告!

          6.為什么國(guó)內(nèi) 996 干不過國(guó)外的 955呢?

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          2b9deaee34b488c884f8297a713839da.webp

          瀏覽 45
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码在线免费观看 | 三级片亚洲 | 无码人妻精品一区二区三区99仓 | 天天爱天天干天天色 | 成年人的免费视频 |