一、INSERT語句中有反斜杠(\)
1、實際測試
咱們用下面這些SQL來測試一下反斜杠(\)在INSERT語句中會是啥樣?
INSERT INTO `user` VALUES (1, '\公孫勝', 18); INSERT INTO `user` VALUES (2, '\\魯智深', 21); INSERT INTO `user` VALUES (3, '\\\林沖', 30); INSERT INTO `user` VALUES (4, '\\\\吳用', 26); INSERT INTO `user` VALUES (5, '\\\\\李逵', 31);
插入后的結果:

我們發現結果如下:
- 當字符串中有1個反斜杠,插入后算0個。
- 當字符串中有2個反斜杠,插入后算1個。
- 當字符串中有3個反斜杠,插入后算1個。
- 當字符串中有4個反斜杠,插入后算2個。
- 當字符串中有5個反斜杠,插入后算2個。
2、原理解釋:
在MySQL中,反斜杠在字符串中是屬於轉義字符,經過語法解析器解析時會進行一次轉義,所以當我們insert反斜杠(\)字符時,如 insert “\” 在數據庫中最終只會存儲"",第一個反斜杠(\)被當做轉義字符處理。
所以我們在代碼中處理插入語句碰到反斜杠時,注意\是否已經改成\\,否則入庫后字符串會不一致。
\:會被當做轉義字符 \\:第一個轉義字符,第二個當做反斜杠 \\\:第一個當做轉義字符,第二個當做反斜杠,第三個當做轉義字符(后面沒有\所以並不會執行轉義) \\\\:第一個當做轉義字符,第二個當做反斜杠,第三個當做轉義字符,第四個當做反斜杠
二、SELECT查詢反斜杠(\)
1、實際測試
我們還是沿用上面的表數據,直接用like模糊匹配來測試一下。
先來測試下"\"跟"\\"反斜杠的執行結果吧:
select * from donglijiedian.`user` where name like '%\%'; select * from donglijiedian.`user` where name like '%\\%';

發現並沒有查詢到數據,其實是SELECT語句中四個反斜杠(\\\\)代表一個\呀,我趕快換成like '%\\\\%'試一試。
mysql> select -> * -> from -> donglijiedian.`user` -> where -> name like '%\\\\%';
+----+------------+------+ | id | name | age | +----+------------+------+ | 2 | \魯智深 | 21 | | 3 | \林沖 | 30 | | 4 | \\吳用 | 26 | | 5 | \\李逵 | 31 | +----+------------+------+ 4 rows in set (0.00 sec)
2、原理解釋
原來在mysql的like語法中,like后邊的字符串除了會在語法解析時轉義一次外,還會在正則匹配時進行第二次的轉義。因此如果期望最終匹配到"",就要反轉義兩次,也就是由"\\\\"到"\\"再到"\"。
如果是普通的精確查詢(=),則無需第二次的正則轉義,和INSERT語句一樣。
