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

          共 5172字,需瀏覽 11分鐘

           ·

          2021-06-23 23:05


          作者 | 陳哈哈

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

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

          在我們平時操作SQL中,一不注意這些符號就會給你背上一口鍋。

          你還別不信,聽叔一句勸,這里的水很深,有些東西,你把握不住…《潘嘎之交》好了,今天咱們就一起針對最膈應人的反斜杠(\),來看看都有哪些坑。

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

          1、實際測試

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

          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:\\\\\陳哈哈\\\\\加班');

          插入后的結果:

          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)結果如下:

          當字符串中有1個反斜杠,插入后算0個。

          當字符串中有2個反斜杠,插入后算1個。

          當字符串中有3個反斜杠,插入后算1個。

          當字符串中有4個反斜杠,插入后算2個。

          當字符串中有5個反斜杠,插入后算2個。

          2、是啥原理?

          后來發(fā)現(xiàn),原因其實很簡單,在MySQL中,反斜杠在字符串中是屬于轉義字符,經(jīng)過語法解析器解析時會進行一次轉義,所以當我們insert反斜杠(\)字符時,如 insert “\” 在數(shù)據(jù)庫中最終只會存儲"",第一個反斜杠(\)被當做轉義字符處理。

          同理,像這種 D:\陳哈哈\加班 字符串,語法解析器解析到第三個反斜杠(\)時,又會把它當做下一個轉義字符進行處理,因此D:\陳哈哈\加班入庫后變成了D:\陳哈哈\加班。

          所以我們在代碼中處理插入語句碰到反斜杠時,注意\是否已經(jīng)改成\,否則入庫后字符串會不一致。

          二、SELECT查詢反斜杠(\)

          1、實際測試

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

          mysql> select * from demo0526;
          +----+-----------------------+
          | id | text                  |
          +----+-----------------------+
          |  1 | D:陳哈哈加班          |
          |  2 | D:\陳哈哈\加班        |
          |  3 | D:\陳哈哈\加班        |
          |  4 | D:\\陳哈哈\\加班      |
          |  5 | D:\\陳哈哈\\加班      |
          +----+-----------------------+

          我們先用單個反斜杠和兩個反斜杠看看能查到啥玩意兒

          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ù),納尼?上面的我白學了嗎?

          別著急,我會告訴你SELECT語句中四個反斜杠(\)代表一個么?呀,我趕快換成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)

          喔?那我如果查詢表中帶有兩個反斜杠(\)的數(shù)據(jù),豈不是要like八個。。。。別攔我,我看看tm是誰設計的這規(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后邊的字符串除了會在語法解析時轉義一次外,還會在正則匹配時進行第二次的轉義。因此如果期望最終匹配到"",就要反轉義兩次,也就是由"\"到""再到""。

          如果是普通的精確查詢(=),則無需第二次的正則轉義,和INSERT語句一樣。

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

          總結

          好了,看到這里同學們有什么感受呢?是不是發(fā)現(xiàn)MySQL中還是存在很多不方便的語法,進步空間還很大呀~~

          在日常工作中,也會經(jīng)常碰到這種符號引發(fā)的問題,尤其是用戶在界面填寫的數(shù)據(jù),建議要做相關限定,明確哪些符號不允許。


          往期推薦

          一次 Nacos 的踩坑記錄!

          無休止加班的真正原因!你們公司是這樣嗎?

          60歲還在寫代碼的開發(fā)者,他的建議或許正是你現(xiàn)在焦慮的根源!嘗試改變一下吧!

          Grafana 8重磅發(fā)布:統(tǒng)一警報、實時流、繼續(xù)炫酷到底!

          Java17 新特性確定,Java之父:終于可以和一個長達25年的漏洞說再見了



          喜歡本文歡迎轉發(fā),關注我訂閱更多精彩

          關注我回復「加群」,加入Spring技術交流群

          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  影音先锋家庭乱伦 | 一级 黄 色情 片 | 欧美永久免费性爱视频 | 天天澡天天狠天天天做 | 黄色三级片免费看的 |