6

我不理解这种 MySQL 行为:如果我想显示 a\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)
4

2 回答 2

11

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

LIKE字符中%并且_具有特殊含义,因此如果要搜索文字%,则需要使用\%,如果要搜索文字,则\%需要转义反斜杠,如\\%.

在字符串语法"中显然具有特殊含义,因此如果要在字符串中包含引号,则需要将其转义为\",而要在字符串中包含文字\",则必须将反斜杠转义为\\"

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


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

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

这样,您需要编写|%|_转义||这些特殊字符。

于 2012-11-16T10:51:50.697 回答
7

请参阅字符串比较函数

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

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

于 2012-11-16T10:52:50.993 回答