Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >这MySQL里的反斜杠(\\)也太坑了吧!!真是醉了

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

作者头像
陈哈哈
发布于 2021-10-13 06:38:50
发布于 2021-10-13 06:38:50
4.6K00
代码可运行
举报
文章被收录于专栏:MySQL入坑记MySQL入坑记
运行总次数:0
代码可运行

小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL江湖路 | 专栏目录

  在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. 当字符串中有1个反斜杠,插入后算0个
  2. 当字符串中有2个反斜杠,插入后算1个
  3. 当字符串中有3个反斜杠,插入后算1个
  4. 当字符串中有4个反斜杠,插入后算2个
  5. 当字符串中有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:\\陈哈哈\\加班      |
+----+-----------------------+
5 rows in set (0.00 sec)

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

代码语言: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 '%\\%'查询后发现都查不到数据,纳尼?上面的我白学了吗?

  别着急,我会告诉你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中还是存在很多不方便的语法,进步空间还很大呀~~

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

  我给你推荐一下本文的姊妹篇《MySQL数据中有很多换行符和回车符!!该咋办?》

好了,多了就不说了,我劝你耗子尾汁,但推荐你关注我,因为我会让你在快乐中学会很多东西!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 中的反斜杠 \\,真是太坑了!!
在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(')、双引号(")、反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题?
程序猿DD
2021/07/13
3.2K0
【MySQL】004.MySQL数据类型
当我们插入128,-129的时候就会发现报错插入的数据超出数据范围。因为tinyint的数据范围是-128 - 127
_孙同学
2025/04/20
730
【MySQL】004.MySQL数据类型
MySQL 中的反斜杠 \\,真是太坑了!!
在MySQL中有很多特殊符号都是相当恶心的,比如字符串中有单引号(')、双引号(")、反斜杠(\)等等,同学们可以先脑补一下可能会出现啥问题?
Java技术栈
2021/06/16
3.2K0
MySQL 中的反斜杠 \\,真是太坑了!!
来源:https://blog.csdn.net/qq_39390545/article/details/117296607
用户2242639
2021/08/20
1.9K0
MySQL的NO_BACKSLASH_ESCAPES
官方说明: https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html 相关资料: https://dev.mys
一见
2018/08/02
1.6K0
MySQL 之单表查询(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一,该笔记用于生产环境快速查阅.
王瑞MVP
2022/12/28
4.9K0
学习 MySQL 需要知道的 28 个小技巧
无论是运维、开发、测试,还是架构师,数据库技术都是一个 必备加薪神器,那么,一直说学习数据库、学 MySQL,到底是要学习它的哪些东西呢?
Lucifer三思而后行
2021/11/29
1K0
MySQL从删库到恢复,还用跑路吗?
误删数据库应该如何恢复操作?怎样才能做好数据库的备份、恢复、容灾、HA?如果你身处数据库行业,最近可能会比较关注这几个问题
搜云库技术团队
2019/10/17
1.3K0
【MySQL 系列】MySQL 语句篇_DML 语句
DML(Data Manipulation Language),即数据操作语言,用于操作数据库对象中所包含的数据。常用关键字包括:插入(INSERT)、更新(UPDATE)、删除(DELETE)。
栗筝i
2024/03/19
5570
【MySQL 系列】MySQL 语句篇_DML 语句
MySQL之表的数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql常用数据类型概览 #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的
人生不如戏
2018/04/10
5.7K0
MySQL之表的数据类型
少年,MySQL Query Rewrite了解一下
作为DBA 大家是否遇到系统遇到bad sql 导致数据库thread_running 飙高,开发短期不能修复(紧急修改,紧急发布之后可能需要小时级别的时间),而且自己又束手无策干等着的情形?
用户1278550
2019/04/25
2.7K0
少年,MySQL Query Rewrite了解一下
MySQL定时任务(EVENT|事件)如何配置,必会技能!
  自MySQL5.1.6起,增加了一个非常有特色的功能 - 事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、数据统计报告、数据备份等等),来取代原先只能由操作系统的计划任务来执行的工作。   值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux的cron)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
陈哈哈
2021/10/13
7.7K0
7天快速掌握MySQL-DAY3
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
披头
2019/12/26
6860
新闻推荐实战(一):MySQL基础
本文属于新闻推荐实战—数据层—构建物料池之MySQL。MySQL数据库在该项目中会用来存储结构化的数据(用户、新闻特征),作为算法工程师需要了解常用的MySQL语法(比如增删改查,排序等),因为在实际的工作经常会用来统计相关数据或者抽取相关特征。本着这个目的,本文对MySQL常见的语法及Python操作MySQL进行了总结,方便大家快速了解。文末附上参考资料
用户9656380
2022/04/14
2.2K0
新闻推荐实战(一):MySQL基础
MySQL必知必会汇总
https://www.cnblogs.com/xbhog/p/13550579.html
xbhog
2021/11/15
1K0
python【第十二篇】Mysql基础
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。 RDBMS即关系数据库管理系统(Relational Database Management System)的特点: (1)数据以表格的形式出现 (2)每行为各种记录名称 (3)每列为记录名称所对应的数据域 (4)许多的行和列组成一张表单 (5)若干的表单组成database
用户1432189
2018/09/05
9560
python【第十二篇】Mysql基础
MyBatis踩坑之SQLProvider转义字符被删除问题
使用MyBatis作为ORM框架,jdbc驱动使用的是mariadb-java-client。
编程随笔
2019/11/23
1.7K0
玩转Mysql系列 - 第7篇:玩转select条件查询,避免采坑
电商中:我们想查看某个用户所有的订单,或者想查看某个用户在某个时间段内所有的订单,此时我们需要对订单表数据进行筛选,按照用户、时间进行过滤,得到我们期望的结果。
路人甲Java
2019/09/16
1.6K0
MySQL安装
在任何版本的 Windows 默认安装是现在比以前要容易得多,MySQL巧妙地打包安装程序。只需下载安装包,随地把它解压缩,并运行 mysql.exe. 下载地址:http://dev.mysql.com/downloads/ 页面如下图所示:
botkenni
2022/01/10
11.4K0
MySQL安装
MySQL基础数据类型
  存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
changxin7
2022/05/06
5K0
MySQL基础数据类型
相关推荐
MySQL 中的反斜杠 \\,真是太坑了!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档