MySQL 中的反斜杠 \\,真是太坑了!!
上一篇:Maven官宣:干掉Maven和Gradle!推出更強(qiáng)更快更牛逼的新一代構(gòu)建工具,炸裂!
作者:_陳哈哈
來源:blog.csdn.net/qq_39390545/article/details/117296607
在我們平時(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)
當(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、是啥原理?
同理,像這種 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ì)不一致。
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)
mysql> SELECT * from demo0526 where text like '%\%';Empty set (0.00 sec)mysql> SELECT * from demo0526 where text like '%\\%';Empty set (0.00 sec)
別著急,我會(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)
mysql> SELECT * from demo0526 where text like '%\\\\\\\\%';+----+-----------------------+| id | text |+----+-----------------------+| 4 | D:\\陳哈哈\\加班 || 5 | D:\\陳哈哈\\加班 |+----+-----------------------+2 rows in set (0.00 sec)
2、又是啥原理?
如果是普通的精確查詢(=),則無需第二次的正則轉(zhuǎn)義,和INSERT語句一樣。
mysql> SELECT * from demo0526 where text = '\\\\';+----+------+| id | text |+----+------+| 7 | \\ |+----+------+1 row in set (0.00 sec)
在日常工作中,也會(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ù)棧
5.清華大學(xué):2021 元宇宙研究報(bào)告!
6.為什么國(guó)內(nèi) 996 干不過國(guó)外的 955呢?
7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

評(píng)論
圖片
表情
