zoukankan      html  css  js  c++  java
  • MySQL 中的反斜杠 \,真是太坑了!!

    在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

    版权声明:本文为CSDN博主「_陈哈哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    近期热文推荐:

    1.1,000+ 道 Java面试题及答案整理(2021最新版)

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

    4.Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    [模板] 循环数组的最大子段和
    [最短路][几何][牛客] [国庆集训派对1]-L-New Game
    [洛谷] P1866 编号
    1115 Counting Nodes in a BST (30 分)
    1106 Lowest Price in Supply Chain (25 分)
    1094 The Largest Generation (25 分)
    1090 Highest Price in Supply Chain (25 分)
    树的遍历
    1086 Tree Traversals Again (25 分)
    1079 Total Sales of Supply Chain (25 分 树
  • 原文地址:https://www.cnblogs.com/javastack/p/14882848.html
Copyright © 2011-2022 走看看