为什么我需要双重转义(使用4 \)在纯SQL中找到反斜杠(\)?

时间:2012-11-16 10:30:57

标签: mysql select escaping sql-like backslash

我不明白这种MySQL的行为:如果我想显示一个\ b,我可以选择"a\\b"无问题地工作:

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

但是,如果我想使用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)

2 个答案:

答案 0 :(得分:7)

首先转义为字符串语法,然后转换为LIKE语法。

LIKE字符中%_具有特殊含义,因此如果您要搜索文字%,则需要使用\%,如果你想搜索文字\%,你需要像\\%一样转义反斜杠。

在字符串语法中"显然具有特殊含义,因此如果要在字符串中包含引号,则需要将其作为\"转义,并在字符串中包含文字\"你必须像\\"中那样逃避反斜杠。

因此,在这两种语法中,您必须转义\


如果您不想使用\来转义LIKE模式,则可以使用ESCAPE关键字。例如:

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

这样,您需要编写|%|_||来逃避这些特殊字符。

答案 1 :(得分:5)

请参阅String Comparison Functions

like运算符与模式进行比较,模式可能包括%_。要逃避这些,您必须使用\。所以反斜杠也是一个特殊的角色。

当你输入模式字符串"a\\\\b"时,它由Mysql解释,然后由like运算符再次解释,它给出"a\\b"然后"a\b"