我不明白这种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)
答案 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"
。