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

在MySQL中有不少特殊符號都是至關噁心的,好比字符串中有單引號(')、雙引號(")、反斜槓(\)等等,同窗們能夠先腦補一下可能會出現啥問題?mysql

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

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

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

一、實際測試.net

我們用下面這些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:\\\\\陳哈哈\\\\\加班');

插入後的結果:code

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

咱們發現結果以下:blog

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

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

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

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

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

二、是啥原理?

後來發現,緣由其實很簡單,在MySQL中,反斜槓在字符串中是屬於轉義字符,通過語法解析器解析時會進行一次轉義,因此當咱們insert反斜槓(\)字符時,如 insert 「\」 在數據庫中最終只會存儲"",第一個反斜槓(\)被當作轉義字符處理。

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

因此咱們在代碼中處理插入語句碰到反斜槓時,注意\是否已經改爲\,不然入庫後字符串會不一致。

2、SELECT查詢反斜槓(\)

一、實際測試

咱們仍是沿用上面的表數據,直接用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)

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

彆着急,我會告訴你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)

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

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

二、又是啥原理?

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

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

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

總結

好了,看到這裏同窗們有什麼感覺呢?是否是發現MySQL中仍是存在不少不方便的語法,進步空間還很大呀~~

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

做者:陳哈哈
原文連接:https://blog.csdn.net/qq_3939...

相關文章
相關標籤/搜索