zoukankan      html  css  js  c++  java
  • MySQL中“”的坑

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

    1、实际测试

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

    INSERT INTO `user` VALUES (1, '公孙胜', 18);
    INSERT INTO `user` VALUES (2, '\鲁智深', 21);
    INSERT INTO `user` VALUES (3, '\林冲', 30);
    INSERT INTO `user` VALUES (4, '\\吴用', 26);
    INSERT INTO `user` VALUES (5, '\\李逵', 31);

    插入后的结果:

    我们发现结果如下:

    • 当字符串中有1个反斜杠,插入后算0个。
    • 当字符串中有2个反斜杠,插入后算1个。
    • 当字符串中有3个反斜杠,插入后算1个。
    • 当字符串中有4个反斜杠,插入后算2个。
    • 当字符串中有5个反斜杠,插入后算2个。

    2、原理解释:

      在MySQL中,反斜杠在字符串中是属于转义字符,经过语法解析器解析时会进行一次转义,所以当我们insert反斜杠()字符时,如 insert “” 在数据库中最终只会存储"",第一个反斜杠()被当做转义字符处理。

    所以我们在代码中处理插入语句碰到反斜杠时,注意是否已经改成\,否则入库后字符串会不一致。

    :会被当做转义字符
    
    \:第一个转义字符,第二个当做反斜杠
    
    \:第一个当做转义字符,第二个当做反斜杠,第三个当做转义字符(后面没有所以并不会执行转义)
    
    \\:第一个当做转义字符,第二个当做反斜杠,第三个当做转义字符,第四个当做反斜杠

    二、SELECT查询反斜杠()

    1、实际测试

    我们还是沿用上面的表数据,直接用like模糊匹配来测试一下。

    先来测试下""跟"\"反斜杠的执行结果吧:

    select 
        *
    from 
        donglijiedian.`user`
    where
        name like '%\%';
        
    select 
        *
    from 
        donglijiedian.`user`
    where
        name like '%\%';

     发现并没有查询到数据,其实是SELECT语句中四个反斜杠(\\代表一个呀,我赶快换成like '%\\%'试一试。

    mysql> select
        -> *
        -> from
        -> donglijiedian.`user`
        -> where
        -> name like '%\\%';
    +----+------------+------+
    | id | name       | age  |
    +----+------------+------+
    |  2 | 鲁智深    |   21 |
    |  3 | 林冲      |   30 |
    |  4 | \吴用     |   26 |
    |  5 | \李逵     |   31 |
    +----+------------+------+
    4 rows in set (0.00 sec)

    2、原理解释

      原来在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到"",就要反转义两次,也就是由"\\"到"\"再到""。

    如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。

  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/zhangzhixi/p/14884150.html
Copyright © 2011-2022 走看看