在我们平时操作SQL中,一不把稳这些符号就会给你背上一口锅。
你还别不信,听叔一句劝,这里的水很深,有些东西,你把握不住…《潘嘎之交》好了,本日咱们就一起针对最膈应人的反斜杠(\),来看看都有哪些坑。
咱们用下面这些SQL来测试一下反斜杠(\)在INSERT语句中会是啥样?

INSERTINTO`demo0526`(`id`,`text`)VALUES(null,'D:\陈哈哈\加班');INSERTINTO`demo0526`(`id`,`text`)VALUES(null,'D:\\陈哈哈\\加班');INSERTINTO`demo0526`(`id`,`text`)VALUES(null,'D:\\\陈哈哈\\\加班');INSERTINTO`demo0526`(`id`,`text`)VALUES(null,'D:\\\\陈哈哈\\\\加班');INSERTINTO`demo0526`(`id`,`text`)VALUES(null,'D:\\\\\陈哈哈\\\\\加班');
插入后的结果:
mysql>selectfromdemo0526;+----+-----------------------+|id|text|+----+-----------------------+|1|D:陈哈哈加班||2|D:\陈哈哈\加班||3|D:\陈哈哈\加班||4|D:\\陈哈哈\\加班||5|D:\\陈哈哈\\加班|+----+-----------------------+5rowsinset(0.00sec)
我们创造结果如下:
当字符串中有1个反斜杠,插入后算0个。
当字符串中有2个反斜杠,插入后算1个。
当字符串中有3个反斜杠,插入后算1个。
当字符串中有4个反斜杠,插入后算2个。
当字符串中有5个反斜杠,插入后算2个。
2、是啥事理?后来创造,缘故原由实在很大略,在MySQL中,反斜杠在字符串中是属于转义字符,经由语法解析器解析时会进行一次转义,以是当我们insert反斜杠(\)字符时,如 insert “\” 在数据库中终极只会存储"",第一个反斜杠(\)被当做转义字符处理。
同理,像这种 D:\\陈哈哈\\加班 字符串,语法解析器解析到第三个反斜杠(\)时,又会把它当做下一个转义字符进行处理,因此D:\\陈哈哈\\加班入库后变成了D:\陈哈哈\加班。
以是我们在代码中处理插入语句碰到反斜杠时,把稳\是否已经改成\,否则入库后字符串会不一致。
二、SELECT查询反斜杠(\)1、实际测试我们还是沿用上面的表数据,直接用like模糊匹配来测试一下。
mysql>selectfromdemo0526;+----+-----------------------+|id|text|+----+-----------------------+|1|D:陈哈哈加班||2|D:\陈哈哈\加班||3|D:\陈哈哈\加班||4|D:\\陈哈哈\\加班||5|D:\\陈哈哈\\加班|+----+-----------------------+
我们先用单个反斜杠和两个反斜杠看看能查到啥玩意儿
mysql>SELECTfromdemo0526wheretextlike'%\%';Emptyset(0.00sec)mysql>SELECTfromdemo0526wheretextlike'%\\%';Emptyset(0.00sec)
啊!
!
我们用like '%%'、like '%\%'查询后创造都查不到数据,纳尼?上面的我白学了吗?
别焦急,我会见告你SELECT语句中四个反斜杠(\\)代表一个么?呀,我赶紧换成like '%\\%'试一试。
mysql>SELECTfromdemo0526wheretextlike'%\\\\%';+----+-----------------------+|id|text|+----+-----------------------+|2|D:\陈哈哈\加班||3|D:\陈哈哈\加班||4|D:\\陈哈哈\\加班||5|D:\\陈哈哈\\加班|+----+-----------------------+4rowsinset(0.00sec)
喔?那我如果查询表中带有两个反斜杠(\)的数据,岂不是要like八个。。。。别拦我,我看看tm是谁设计的这规则。
mysql>SELECTfromdemo0526wheretextlike'%\\\\\\\\%';+----+-----------------------+|id|text|+----+-----------------------+|4|D:\\陈哈哈\\加班||5|D:\\陈哈哈\\加班|+----+-----------------------+2rowsinset(0.00sec)
2、又是啥事理?
原来在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望终极匹配到"",就要反转义两次,也便是由"\\"到"\"再到""。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。
mysql>SELECTfromdemo0526wheretext='\\\\';+----+------+|id|text|+----+------+|7|\\|+----+------+1rowinset(0.00sec)
总结
好了,看到这里同学们有什么感想熏染呢?是不是创造MySQL中还是存在很多未便利的语法,进步空间还很大呀~~
在日常事情中,也会常常碰到这种符号引发的问题,尤其是用户在界面填写的数据,建议要做干系限定,明确哪些符号不许可。
作者:陈哈哈
原文链接:https://blog.csdn.net/qq_39390545/article/details/117296607