MySQL中“\”的坑


一、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語句一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM