新四季網

mysql中如何使用斷言(MySQL中的反斜槓)

2023-08-04 00:57:38 2

mysql中如何使用斷言?在MySQL中有很多特殊符號都是相當噁心的,比如字符串中有單引號(')、雙引號(")、反斜槓(\)等等,同學們可以先腦補一下可能會出現啥問題?,下面我們就來聊聊關於mysql中如何使用斷言?接下來我們就一起去了解一下吧!

mysql中如何使用斷言

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

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

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

一、INSERT語句中有反斜槓(\)1、實際測試

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

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

插入後的結果:

mysql>select*fromdemo0526; ---- ----------------------- |id|text| ---- ----------------------- |1|D:陳哈哈加班||2|D:\陳哈哈\加班||3|D:\陳哈哈\加班||4|D:\\陳哈哈\\加班||5|D:\\陳哈哈\\加班| ---- ----------------------- 5rowsinset(0.00sec)

我們發現結果如下:

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

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

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

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

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

2、是啥原理?

後來發現,原因其實很簡單,在MySQL中,反斜槓在字符串中是屬於轉義字符,經過語法解析器解析時會進行一次轉義,所以當我們insert反斜槓(\)字符時,如 insert 「\」 在資料庫中最終只會存儲"",第一個反斜槓(\)被當做轉義字符處理。

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

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

二、SELECT查詢反斜槓(\)1、實際測試

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

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

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

mysql>SELECT*fromdemo0526wheretextlike'%\%';Emptyset(0.00sec)mysql>SELECT*fromdemo0526wheretextlike'%\\%';Emptyset(0.00sec)

啊!!我們用like '%%'、like '%\%'查詢後發現都查不到數據,納尼?上面的我白學了嗎?

別著急,我會告訴你SELECT語句中四個反斜槓(\\)代表一個麼?呀,我趕快換成like '%\\%'試一試。

mysql>SELECT*fromdemo0526wheretextlike'%\\\\%'; ---- ----------------------- |id|text| ---- ----------------------- |2|D:\陳哈哈\加班||3|D:\陳哈哈\加班||4|D:\\陳哈哈\\加班||5|D:\\陳哈哈\\加班| ---- ----------------------- 4rowsinset(0.00sec)

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

mysql>SELECT*fromdemo0526wheretextlike'%\\\\\\\\%'; ---- ----------------------- |id|text| ---- ----------------------- |4|D:\\陳哈哈\\加班||5|D:\\陳哈哈\\加班| ---- ----------------------- 2rowsinset(0.00sec)

2、又是啥原理?

原來在mysql的like語法中,like後邊的字符串除了會在語法解析時轉義一次外,還會在正則匹配時進行第二次的轉義。因此如果期望最終匹配到"",就要反轉義兩次,也就是由"\\"到"\"再到""。

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

mysql>SELECT*fromdemo0526wheretext='\\\\'; ---- ------ |id|text| ---- ------ |7|\\| ---- ------ 1rowinset(0.00sec)

總結

好了,看到這裡同學們有什麼感受呢?是不是發現MySQL中還是存在很多不方便的語法,進步空間還很大呀~~

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

作者:陳哈哈

原文連結:https://blog.csdn.net/qq_39390545/article/details/117296607

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了