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文字%で とは_特別な意味を持つため、literal を検索する%場合は を使用する必要があり\%、literal を検索する場合は\%のようにバックスラッシュをエスケープする必要があります\\%

文字列構文"には明らかに特別な意味があるため、文字列に引用符を含めたい場合は としてエスケープする必要があり、文字列\"にリテラルを含めるには\"のようにバックスラッシュをエスケープする必要があります\\"

したがって、両方の構文でエスケープする必要があります\


\LIKE パターンをエスケープするために使用したくない場合は、ESCAPE キーワードを使用できます。例えば:

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

このように、これらの特殊文字を記述|%する|_か、エスケープする必要があります。||

于 2012-11-16T10:51:50.697 に答える
7

文字列比較関数を参照してください

演算子は、およびを含む可能性のlikeあるパターンと比較します。これらをエスケープするには、 を使用する必要があります。したがって、バックスラッシュも特殊文字です。%_\

パターン文字列を入力する"a\\\\b"と、Mysql によって解釈され、次に like 演算子によって解釈され"a\\b"ます"a\b"

于 2012-11-16T10:52:50.993 に答える