MySQL里的反斜杠(\\\\)的使用
作者:GeGe&YoYo 时间:2024-01-26 03:20:57
一、INSERT语句中有反斜杠(\)
1. 实际测试
咱们用下面这些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:\\\\\陈哈哈\\\\\加班');
插入后的结果:
mysql> select * from demo0526;
+----+-----------------------+
| id | text |
+----+-----------------------+
| 1 | D:陈哈哈加班 |
| 2 | D:\陈哈哈\加班 |
| 3 | D:\陈哈哈\加班 |
| 4 | D:\\陈哈哈\\加班 |
| 5 | D:\\陈哈哈\\加班 |
+----+-----------------------+
5 rows in set (0.00 sec)
我们发现结果如下:
当字符串中有1个反斜杠,插入后算0个。
当字符串中有2个反斜杠,插入后算1个。
当字符串中有3个反斜杠,插入后算1个。
当字符串中有4个反斜杠,插入后算2个。
当字符串中有5个反斜杠,插入后算2个。
2. 原理
在MySQL中,反斜杠在字符串中是属于转义字符,经过语法解析器解析时会进行一次转义,所以当我们insert反斜杠(\)字符时,如 insert “\” 在数据库中最终只会存储"",第一个反斜杠(\)被当做转义字符处理。
同理,像这种 D:\\\陈哈哈\\\加班 字符串,语法解析器解析到第三个反斜杠(\)时,又会把它当做下一个转义字符进行处理,因此D:\\\陈哈哈\\\加班入库后变成了D:\陈哈哈\加班。
二、SELECT查询反斜杠(\)
1. 实际测试
我们还是沿用上面的表数据,直接用like模糊匹配来测试一下。
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)
啊!!我们用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)
2. 原理
在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到"",就要反转义两次,也就是由"\\\\"到"\\"再到"\"。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。
mysql> SELECT * from demo0526 where text = '\\\\';
+----+------+
| id | text |
+----+------+
| 7 | \\ |
+----+------+
1 row in set (0.00 sec)
来源:https://blog.csdn.net/weixin_47410172/article/details/127802860
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解决CentOS下ImportError: No module named '_sqlite3'的问题
Python如何定义有默认参数的函数
Python学习笔记之迭代器和生成器用法实例详解
JavaScript程序执行顺序问题总结
JavaScript 日期联动选择器
MySQL创建、修改和删除表操作指南
![](https://img.aspxhome.com/file/2023/4/76354_0s.png)
遗传算法之Python实现代码
从列表或字典创建Pandas的DataFrame对象的方法
![](https://img.aspxhome.com/file/2023/2/130642_0s.png)
使用matplotlib绘制图例标签中带有公式的图
![](https://img.aspxhome.com/file/2023/4/82954_0s.jpg)
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
![](https://img.aspxhome.com/file/2023/3/67353_0s.png)
解决mysql创建数据库后出现:Access denied for user 'root'@'%' to database 'xxx'的问题
golang 调用c语言动态库方式实现
MySQL范围查询优化的场景实例详解
表单系列·出错字段排行榜
JavaScript forEach()遍历函数使用及介绍
Python如何存储和读取ASCII码形式的byte数据
![](https://img.aspxhome.com/file/2023/9/113109_0s.png)
JavaScript简单实现的仿微博留言功能示例
![](https://img.aspxhome.com/file/2023/5/136425_0s.png)
python读写文件write和flush的实现方式
win10环境下配置vscode python开发环境的教程详解
![](https://img.aspxhome.com/file/2023/1/71991_0s.png)
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
![](https://img.aspxhome.com/file/2023/4/85054_0s.png)