<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 中的反斜杠 \\,真是太坑了??!

          共 5249字,需瀏覽 11分鐘

           ·

          2021-06-24 02:01

          點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注
          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包
          真愛(ài),請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看
          原文鏈接:https://blog.csdn.net/qq_39390545/article/details/117296607
          在MySQL中有很多特殊符號(hào)都是相當(dāng)惡心的,比如字符串中有單引號(hào)(')、雙引號(hào)(")、反斜杠(\)等等,同學(xué)們可以先腦補(bǔ)一下可能會(huì)出現(xiàn)啥問(wèn)題?
          在我們平時(shí)操作SQL中,一不注意這些符號(hào)就會(huì)給你背上一口鍋。
          你還別不信,聽(tīng)叔一句勸,這里的水很深,有些東西,你把握不住…《潘嘎之交》好了,今天咱們就一起針對(duì)最膈應(yīng)人的反斜杠(\),來(lái)看看都有哪些坑。

          一、INSERT語(yǔ)句中有反斜杠(\)

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

          咱們用下面這些SQL來(lái)測(cè)試一下反斜杠(\)在INSERT語(yǔ)句中會(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、是啥原理?

          后來(lái)發(fā)現(xiàn),原因其實(shí)很簡(jiǎn)單,在MySQL中,反斜杠在字符串中是屬于轉(zhuǎn)義字符,經(jīng)過(guò)語(yǔ)法解析器解析時(shí)會(huì)進(jìn)行一次轉(zhuǎn)義,所以當(dāng)我們insert反斜杠(\)字符時(shí),如 insert “\” 在數(shù)據(jù)庫(kù)中最終只會(huì)存儲(chǔ)"",第一個(gè)反斜杠(\)被當(dāng)做轉(zhuǎn)義字符處理。
          同理,像這種 D:\\陳哈哈\\加班 字符串,語(yǔ)法解析器解析到第三個(gè)反斜杠(\)時(shí),又會(huì)把它當(dāng)做下一個(gè)轉(zhuǎn)義字符進(jìn)行處理,因此D:\\陳哈哈\\加班入庫(kù)后變成了D:\陳哈哈\加班。
          所以我們?cè)诖a中處理插入語(yǔ)句碰到反斜杠時(shí),注意\是否已經(jīng)改成\,否則入庫(kù)后字符串會(huì)不一致。

          二、SELECT查詢反斜杠(\)

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

          我們還是沿用上面的表數(shù)據(jù),直接用like模糊匹配來(lái)測(cè)試一下。
          mysql> select * from demo0526;
          +----+-----------------------+
          | id | text                  |
          +----+-----------------------+
          |  1 | D:陳哈哈加班          |
          |  2 | D:\陳哈哈\加班        |
          |  3 | D:\陳哈哈\加班        |
          |  4 | D:\\陳哈哈\\加班      |
          |  5 | D:\\陳哈哈\\加班      |
          +----+-----------------------+
          我們先用單個(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)
          ?。?!我們用like '%%'、like '%\%'查詢后發(fā)現(xiàn)都查不到數(shù)據(jù),納尼?上面的我白學(xué)了嗎?
          別著急,我會(huì)告訴你SELECT語(yǔ)句中四個(gè)反斜杠(\\)代表一個(gè)么?呀,我趕快換成like '%\\%'試一試。
          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是誰(shuí)設(shè)計(jì)的這規(guī)則。
          mysql> SELECT * from demo0526 where text like '%\\\\\\\\%';
          +----+-----------------------+
          | id | text                  |
          +----+-----------------------+
          |  4 | D:\\陳哈哈\\加班      |
          |  5 | D:\\陳哈哈\\加班      |
          +----+-----------------------+
          2 rows in set (0.00 sec)

          2、又是啥原理?

          原來(lái)在mysql的like語(yǔ)法中,like后邊的字符串除了會(huì)在語(yǔ)法解析時(shí)轉(zhuǎn)義一次外,還會(huì)在正則匹配時(shí)進(jìn)行第二次的轉(zhuǎn)義。因此如果期望最終匹配到"",就要反轉(zhuǎn)義兩次,也就是由"\\"到"\"再到""。
          如果是普通的精確查詢(=),則無(wú)需第二次的正則轉(zhuǎn)義,和INSERT語(yǔ)句一樣。
          mysql> SELECT * from demo0526 where text = '\\\\';
          +----+------+
          | id | text |
          +----+------+
          |  7 | \\   |
          +----+------+
          1 row in set (0.00 sec)

          總結(jié)

          好了,看到這里同學(xué)們有什么感受呢?是不是發(fā)現(xiàn)MySQL中還是存在很多不方便的語(yǔ)法,進(jìn)步空間還很大呀~~
          在日常工作中,也會(huì)經(jīng)常碰到這種符號(hào)引發(fā)的問(wèn)題,尤其是用戶在界面填寫(xiě)的數(shù)據(jù),建議要做相關(guān)限定,明確哪些符號(hào)不允許。
          版權(quán)聲明:本文為CSDN博主「_陳哈哈」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
          - END -

          最近熱文

          ?  微信這項(xiàng)功能即將下線,趕快導(dǎo)出數(shù)據(jù)!
          ?  華為奇葩面試題:一頭牛重800公斤一座橋承重700公斤,請(qǐng)問(wèn)牛怎么過(guò)橋?
          ?  985研究生組團(tuán)詐騙,一個(gè)中招就關(guān)App,涉案金額超1億,受害人遍布全國(guó)
          ?  請(qǐng)立即卸載這款 IDEA 插件

          瀏覽 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>
                  国产乱子伦-区二区三区 | 日韩黄色视频免费看 | 日本影片一区 | 自拍偷拍A√ | 乱码黄在线 |