作者 | 陈哈哈

来源 | https://blog.csdn.net/qq_39390545/article/details/117296607

在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(')、双引号(")、反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题?

在我们平时操作SQL中,一不注意这些符号就会给你背上一口锅。

你还别不信,听叔一句劝,这里的水很深,有些东西,你把握不住…《潘嘎之交》好了,今天咱们就一起针对最膈应人的反斜杠(\),来看看都有哪些坑。

一、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:\\陈哈哈\\加班      |
+----+-----------------------+

我们先用单个反斜杠和两个反斜杠看看能查到啥玩意儿

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)

总结

好了,看到这里同学们有什么感受呢?是不是发现MySQL中还是存在很多不方便的语法,进步空间还很大呀~~

在日常工作中,也会经常碰到这种符号引发的问题,尤其是用户在界面填写的数据,建议要做相关限定,明确哪些符号不允许。

往期推荐

一次 Nacos 的踩坑记录!

无休止加班的真正原因!你们公司是这样吗?

60岁还在写代码的开发者,他的建议或许正是你现在焦虑的根源!尝试改变一下吧!

Grafana 8重磅发布:统一警报、实时流、继续炫酷到底!

Java17 新特性确定,Java之父:终于可以和一个长达25年的漏洞说再见了

喜欢本文欢迎转发,关注我订阅更多精彩

关注我回复「加群」,加入Spring技术交流群

MySQL 中的反斜杠 \\,真是太坑了!!相关推荐

  1. 卧槽! MySQL 中的反斜杠 \\ 真是太恶心了

    点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 在 MySQL 中有很多特殊符号都是相当恶心的,比如字符串中有单引号(').双引号(").反斜 ...

  2. MySQL 中的反斜杠 \\

    叙述 在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(').双引号(").反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题? 在我们平时操作SQL中,一不注意这些符号 ...

  3. Mysql中查询反斜杠

    一. 模糊查询需要转四个反斜杠 二. 其他查询需要转两个反斜杠

  4. 反斜杠转义mysql java_mysql数据库中的反斜杠”\“怎么使用Java进行转义

    mysql数据库中的反斜杠"\"怎么使用Java进行转义 发布时间:2020-11-24 15:15:12 来源:亿速云 阅读:88 作者:Leah 这期内容当中小编将会给大家带来 ...

  5. 这MySQL里的反斜杠(\\)也太坑了吧!!真是醉了

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录   在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(').双引号(").反斜杠(\)等等, ...

  6. java反斜杠_如何在字符串中使用反斜杠(\)?

    (请参阅答案末尾的ES2015更新.) 您已经标记的问题都string和regex. 在JavaScript中,反斜杠在字符串文字和正则表达式中都有特殊含义.如果你想在字符串或正则表达式中使用实际的反 ...

  7. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: 1 java.util.regex. ...

  8. php的转义字符quot;反斜杠quot;是,php如何去除转义字符中的反斜杠

    php去除转义字符中的反斜杠的方法:使用函数stripslashes去掉转义后字符串中的反斜杠,代码为[if (is_string($v)) {$array[$k] = stripslashes($v ...

  9. 黄聪:PHP去掉转义后字符串中的反斜杠\函数stripslashes

    addslashes函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes则是去掉转义后字符串中的反斜杠\,比如当你提交一段json数据到PHP端的时候可能会遇到json字符串中有 ...

最新文章

  1. Delphi常见的运行期Access Violation错误分析
  2. hazelcast_Hazelcast的MapLoader陷阱
  3. EBS业务学习之应收管理
  4. java 线程 wait 一定要同步_java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常...
  5. Android下Cocos2d创建HelloWorld工程
  6. jdk,Eclipse,SWTDesigner安装【原创】
  7. 【报告分享】2020社交电商消费者购物行为研究报告:传统与创新进入融合时代.pdf(附下载链接)...
  8. matplotlib 可视化 —— matplotlib.patches
  9. python自动化任务_Python任务自动化工具tox使用教程
  10. 笔记本关闭触摸板——解决无法关闭触摸板问题
  11. html form提交heard,德普前妻Amber Heard戛纳合辑
  12. 指数分布java_终于搞清楚正态分布、指数分布到底是啥了!
  13. NCRE教材笔记 第一章操作系统概论
  14. autojs autoxjs text 选不中 失效 uiselector
  15. android开机默认打开指定程序,android 开机默认进入指定Launcher
  16. win10开启自带的手机投屏功能方式
  17. DDoS攻击流量检测方法
  18. 项目进度管理服务器,工程项目进度管理软件Asta Powerproject——成功项目背后的力量...
  19. LeetCode: 953. 验证外星语词典
  20. vmstat 命令参数详解

热门文章

  1. Windows 7各版本主要区别
  2. SQL Relay 0.47 发布,SQL 中间层
  3. 无厘头的mysql故障排除
  4. ASP程序快速生成Excel文件
  5. 用Eclipse进行远程Debug代码
  6. linux 修改 ko文件内核版本号
  7. 视频监控软件 SecuritySpy 简介
  8. linux 连接跟踪nf_conntrack 与 NAT和状态防火墙
  9. 关于外挂新手最常见的30个问题
  10. C语言一个双向链表的实现