1

列があるstudentテーブルがありdescriptionます。ここで、「\」(バックスラッシュ) を含むすべてのレコードを選択したいと考えていますdescription特殊文字シーケンス「\\」に従って正しい場合、「\」を表します。

ただし、次のようなクエリは機能しません。

SELECT * FROM student WHERE description LIKE '%\\%'

そして、次のクエリが機能しています:

SELECT * FROM student WHERE description LIKE '%\\\%'

SELECT * FROM student WHERE description LIKE '%\\\\%'

MySqlだから、どう評価されているか分からない。

4

5 に答える 5

1

http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

MySQL は文字列で C エスケープ構文を使用するため (たとえば、"\n" で改行文字を表す)、LIKE 文字列で使用する "\" を二重にする必要があります。たとえば、「\n」を検索するには、「\n」と指定します。「\」を検索するには、「\\\\」と指定します。これは、バックスラッシュがパーサーによって 1 回削除され、パターン マッチが行われたときに再び削除されるためです。

「パーサー バックスラッシュ ストリップ」のみを保持する回避策として、次の構文を使用します。

select * from T where s like "%\\%" escape "#";

(ここで使用します#が、クエリ文字列に存在しない他の文字はエスケープに使用できます)。

http://sqlfiddle.com/#!2/fa5d9/5を参照してください。

于 2013-07-30T10:24:14.093 に答える
1

これは私のために働く:

SELECT * FROM student WHERE description LIKE '%\\\%'

文字列リテラル用と LIKE パターン用の 2 つのレベルのエスケープが必要です。

これも機能します:

SELECT * FROM student WHERE description LIKE '%\\\\%';

最初のもの\%はエスケープ シーケンスではないため、バックスラッシュが残されているため機能し\\ます。

デモ

于 2013-07-30T10:20:47.633 に答える
0

このページを読む必要があります。

MySQL は文字列で C エスケープ構文を使用するため (たとえば、"\n" で改行文字を表す)、LIKE 文字列で使用する "\" を二重にする必要があります。たとえば、「\n」を検索するには、「\n」と指定します。「\」を検索するには、「\\」と指定します。これは、バックスラッシュがパーサーによって 1 回削除され、パターン マッチが行われたときに再び削除されるためです。

例外: パターン文字列の最後に、バックスラッシュを「\」として指定できます。文字列の最後では、エスケープするものが何もないため、バックスラッシュはそれ自体を表します。テーブルに次の値が含まれているとします。

于 2013-07-30T10:24:07.680 に答える
0

最初に \ リテラルをエスケープする必要があります。同様に、エスケープされたリテラルもエスケープする必要があります。以下の例を参照してください。

正規表現に必要なエスケープは 1 つだけです。

select * from student where test_char REGEXP "[\\]+";

LIKE には、追加のエスケープが 1 つ必要です。

select * from student where test_char LIKE '%\\\%'
于 2013-07-30T10:26:17.837 に答える