为什么我需要双击逃生(使用4 \\)找到纯SQL反斜杠(\\)?(Why I need to dou

2019-07-03 21:09发布

我不明白这个MySQL的行为:如果我想显示A \ B,我就可以选择"a\\b"这没有问题的工作:

mysql> select "a\\b";
+-----+
| a\b |
+-----+
| a\b |
+-----+
1 row in set (0.05 sec)

但是,如果我wnat搜索使用LIKE包含一个表中的\字符串,我需要双击逃不过我的“\”。 为什么呢?

下面是一个例子。

我们准备一张小桌子。

create table test ( test varchar(255) );
insert into test values ( "a\\b" ) , ( "a\\b\\c" ) , ( "abcd" );

mysql> select * from test;
+-------+
| test  |
+-------+
| a\b   |
| a\b\c |
| abcd  |
+-------+
3 rows in set (0.05 sec)

我们试图让由“A \ B”开头的条目...

mysql> select * from test where test LIKE "a\\b%";
+------+
| test |
+------+
| abcd |
+------+
1 row in set (0.05 sec)

为什么\\只是忽略了呢? 为什么我需要双击逃生basckslash得到我预期的结果?

mysql> select * from test where test LIKE "a\\\\b%";
+-------+
| test  |
+-------+
| a\b   |
| a\b\c |
+-------+
2 rows in set (0.04 sec)

Answer 1:

你先逃避字符串形式,然后LIKE语法。

LIKE字符%_有特殊的意义,所以如果你想搜索的文字% ,则需要使用\%如果你要搜索的文字\%需要转义反斜线作为\\%

在字符串语法"显然具有特殊的意义,因此,如果您想包括你需要躲避它作为字符串中引号\" ,并包括文字\"你必须转义反斜线作为字符串中的\\"

因此,在这两种语法,你必须逃脱\


如果你不希望使用\逃脱LIKE模式,您可以使用ESCAPE关键字。 例如:

...  where test LIKE "a\\b%" ESCAPE '|';

这样一来,你就需要写|% |_|| 逃避这些特殊字符。



Answer 2:

见字符串比较函数

like运算符比较反对的模式,其中可能包括%_ 。 为了逃避这些,你必须使用\ 。 所以反斜杠是一个特殊字符,太。

当你进入模式串"a\\\\b"它是由MySQL解释,然后再通过类似操作,至极给人"a\\b" ,然后"a\b"



文章来源: Why I need to double-escape (use 4 \\) to find a backslash ( \\ ) in pure SQL?