前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 中的反斜杠 \\,真是太坑了!!

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

作者头像
用户2242639
发布于 2021-08-20 06:57:43
发布于 2021-08-20 06:57:43
2K00
代码可运行
举报
文章被收录于专栏:Java经验总结Java经验总结
运行总次数:0
代码可运行

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

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

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

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

一、INSERT语句中有反斜杠(\)

1、实际测试

咱们用下面这些SQL来测试一下反斜杠(\)在INSERT语句中会是啥样?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:\\\\\陈哈哈\\\\\加班');

插入后的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模糊匹配来测试一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select * from demo0526;
+----+-----------------------+
| id | text                  |
+----+-----------------------+
|  1 | D:陈哈哈加班          |
|  2 | D:\陈哈哈\加班        |
|  3 | D:\陈哈哈\加班        |
|  4 | D:\\陈哈哈\\加班      |
|  5 | D:\\陈哈哈\\加班      |
+----+-----------------------+

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 '%%'查询后发现都查不到数据,纳尼?上面的我白学了吗?另外,MySQL 面试题和答案都整理完了,微信搜索Java技术栈,在后台发送关键字:面试。

别着急,我会告诉你SELECT语句中四个反斜杠(\)代表一个么?呀,我赶快换成like '%\%'试一试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是谁设计的这规则。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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语句一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> SELECT * from demo0526 where text = '\\\\';
+----+------+
| id | text |
+----+------+
|  7 | \\   |
+----+------+
1 row in set (0.00 sec)

总结

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java经验总结 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 中的反斜杠 \\,真是太坑了!!
在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(')、双引号(")、反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题?
程序猿DD
2021/07/13
3.3K0
MySQL 中的反斜杠 \\,真是太坑了!!
在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(')、双引号(")、反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题?
Java技术栈
2021/06/16
3.3K0
这MySQL里的反斜杠(\\)也太坑了吧!!真是醉了
  后来发现,原因其实很简单,在MySQL中,反斜杠在字符串中是属于转义字符,经过语法解析器解析时会进行一次转义,所以当我们insert反斜杠(\)字符时,如 insert “\” 在数据库中最终只会存储"",第一个反斜杠(\)被当做转义字符处理。
陈哈哈
2021/10/13
4.6K0
MySQL 之 JSON 支持(一)—— JSON 数据类型
MySQL 支持由 RFC 7159 所定义的原生 JSON 数据类型,通过该类型能够有效访问 JSON(JavaScript 对象表示法)文档中的数据。与将 JSON 格式字符串存储在字符串列中相比,JSON 数据类型提供了以下优点:
用户1148526
2024/06/06
3.9K0
MySQL 快速入门(一)
ps:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符,超出报错
HammerZe
2022/03/24
1.6K0
MySQL 快速入门(一)
Python : 反斜杠
使用python写字符串常量时,raw string是个很好用的东东,比如在C里我要写一个Windows下的路径,得这么
py3study
2020/01/07
4K0
MySQL安装
在任何版本的 Windows 默认安装是现在比以前要容易得多,MySQL巧妙地打包安装程序。只需下载安装包,随地把它解压缩,并运行 mysql.exe. 下载地址:http://dev.mysql.com/downloads/ 页面如下图所示:
botkenni
2022/01/10
11.5K0
MySQL安装
MySQL或者MariaDB里面sql_mode的设置详解
地址:http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html
保持热爱奔赴山海
2019/09/18
2.5K0
MySQL数据类型
注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不 下,与其如此,还不如设计时,将int类型提升为bigint类型。
用户11316056
2025/02/17
1290
MySQL数据类型
学习 MySQL 需要知道的 28 个小技巧
无论是运维、开发、测试,还是架构师,数据库技术都是一个 必备加薪神器,那么,一直说学习数据库、学 MySQL,到底是要学习它的哪些东西呢?
Lucifer三思而后行
2021/11/29
1K0
Mysql系列 - 第2天:详解mysql数据类型(重点)
上面表格中有符号和无符号写反了,[]包含的内容是可选的,默认是无符号类型的,无符号的需要在类型后面跟上unsigned
路人甲Java
2019/09/16
1.1K0
Mysql系列 - 第2天:详解mysql数据类型(重点)
MySQL从删库到恢复,还用跑路吗?
误删数据库应该如何恢复操作?怎样才能做好数据库的备份、恢复、容灾、HA?如果你身处数据库行业,最近可能会比较关注这几个问题
搜云库技术团队
2019/10/17
1.3K0
MyBatis踩坑之SQLProvider转义字符被删除问题
使用MyBatis作为ORM框架,jdbc驱动使用的是mariadb-java-client。
编程随笔
2019/11/23
1.7K0
《MySQL核心知识》第3章:MySQL中的运算符
今天是《MySQL核心知识》专栏的第3章,今天跟大家一起聊聊MySQL中的运算符。好了,开始今天的正题。
冰河
2022/08/05
7480
《MySQL核心知识》第3章:MySQL中的运算符
【mysql】比较运算符
比较运算符 = <=> <> != < <= > >= 比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情况则返回NULL。 比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。 [请添加图片描述] [请添加图片描述]1. 等号运算符(=) 等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。 在使用等号运算符时,遵循如下规则: 如果等号两边的值、字符串或表达式都
兮动人
2022/03/02
2.6K0
MySQL数据库数据类型
在MySQL数据库中,MySQL数据类型分有四大类:数值类型、文本/二进制类型、时间日期和String类型。以下是这四大类的具体类型:
二肥是只大懒蓝猫
2023/10/13
3620
MySQL数据库数据类型
路径中 斜杠/和反斜杠\ 的区别
路径中使用斜杠/和反斜杠\的区别到底是什么。查阅了一些资料后可知。 Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符。 Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作为路径分隔符。所以目前windows系统上的文件浏览器都是用 反斜杠\ 作为路径分隔符。随着发展,DOS系统已经被淘汰了,命令提示符也用的很少,斜杆和反斜杠在大多数情况下可以互换,没有影响。 知道这个背景后,可以总结一下结论: (1)浏览器地址栏网址使用 斜杆/ ; (2)windows文件浏览器上使用 反斜杠\ ; (3)出现在html url() 属性中的路径,指定的路径是网络路径,所以必须用 斜杆/ ;
全栈程序员站长
2022/07/07
2.9K0
MySQL定时任务(EVENT|事件)如何配置,必会技能!
  自MySQL5.1.6起,增加了一个非常有特色的功能 - 事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、数据统计报告、数据备份等等),来取代原先只能由操作系统的计划任务来执行的工作。   值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux的cron)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
陈哈哈
2021/10/13
7.8K0
MySQL数据类型
总结: 如果插入的数据超过MySQL数据类型的范围,那么MySQL就不让你插入,直接拦截,不让做对应的操作。这点和C/C++一样,但是编译器不会报错,语言上给你发生截断,编译器内部可能会隐式转换。 如果已经有数据被成功插入到MySQL中,那么插入的时候一定是合法的。 因此,MySQL中,一般而言,数据类型本身也是一种约束。这种约束倒逼程序员,让程序员尽可能正确插入,如果不正确插入,MySQL也能保证插入的数据合法性。这样就能保证数据库中的数据是可预期完整的。
南桥
2024/07/26
1610
MySQL数据类型
【MySQL 系列】MySQL 语句篇_DML 语句
DML(Data Manipulation Language),即数据操作语言,用于操作数据库对象中所包含的数据。常用关键字包括:插入(INSERT)、更新(UPDATE)、删除(DELETE)。
栗筝i
2024/03/19
8940
【MySQL 系列】MySQL 语句篇_DML 语句
相关推荐
MySQL 中的反斜杠 \\,真是太坑了!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验