社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

鸭哥聊Java • 2 年前 • 346 次点击  

大家好,我是鸭哥。


在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中还是存在很多不方便的语法,进步空间还很大呀~~


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

作者:陈哈哈
来源:https://blog.csdn.net/qq_39390545/article/details/117296607



程序员技术交流群

有不少同学给鸭哥说,现在进大厂太难了!赚钱太难!因此,鸭哥特意邀请了华为、腾讯、阿里的朋友进群,与大家一起交流经验,一起增长技术。

有兴趣入群的同学,可长按扫描下方二维码,一定要备注:城市+昵称+技术方向,根据格式备注,可更快被通过且邀请进群。

▲长按扫描


近期技术热文

1、 中国移动竟然敢称鸿蒙盗版安卓!?这下打脸了吧!

2、MyBatis架构与原理深入解析

3、不会吧!抖音竟然又在搞事情?

4、什么是业务,什么是业务架构?

点击下方公众号
回复关键字【666
领取资料


我就知道你会点赞+“在看”

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/116204
 
346 次点击