Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
609 views
in Technique[技术] by (71.8m points)

mysql - Why I need to double-escape (use 4 ) to find a backslash ( ) in pure SQL?

I do not understand this MySQL behaviour : if I want to display a, I can just select "a\b" which work without problem :

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

But if I wnat to search a string containing a in a table using LIKE, I need to double-escape my "". Why ?

Here is an example.

We prepare a small table.

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

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

We try to get entries beginning by "a" ...

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

Why \ is just ignored there? Why I need to double-escape basckslash to get my expected result?

mysql> select * from test where test LIKE "a\\b%";
+-------+
| test  |
+-------+
| a   |
| ac |
+-------+
2 rows in set (0.04 sec)
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You escape first for the string syntax, then for LIKE syntax.

In LIKE characters % and _ have special meaning, so if you want to search for literal %, you need to use \%, and if you want to search for literal \% you need to escape the backslash as in \%.

In string syntax " obviously has special meaning, so if you want to include quote in the string you need to escape it as ", and to include literal " in the string you have to escape the backslash as in ".

So in both syntaxes you have to escape .


If you don't want to use to escape the LIKE pattern , you can use ESCAPE keyword. For example:

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

This way, you'll need to write |%, |_ or || to escape these special chars.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...