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

Ala*_*blo 4 mysql select escaping backslash sql-like

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

mysql> select "a\\b";
+-----+
| a\b |
+-----+
| a\b |
+-----+
1 row in set (0.05 sec)
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用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)
Run Code Online (Sandbox Code Playgroud)

我们尝试以"a\b"开头的条目......

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

为什么\\在那里被忽略?为什么我需要双重逃避basckslash才能获得预期的结果?

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

Kor*_*nel 8

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

LIKE字符%_具有特殊含义,所以如果你想搜索文字%,你需要使用\%,如果你想搜索文字,\%你需要转义反斜杠\\%.

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

所以在两种语法中你都必须逃避\.


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

...  where test LIKE "a\\b%" ESCAPE '|';
Run Code Online (Sandbox Code Playgroud)

通过这种方式,你需要写|%,|_||逃避这些特殊字符.


Ola*_*che 5

请参见字符串比较函数

like运营商比较反对的模式,其中可能包括%_.要逃避这些,你必须使用\.所以反斜杠也是一个特殊的角色.

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