9

次のように、mysql ステートメントで LIKE 句を使用しようとしています。

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956%'

「FilePath」列内のデータと一致するデータは次のとおりです。

C:\SCAN\Parker_Apple_Ben_20-10-1830\TEST

上記の SQL ステートメントは正常に機能し、関連する行を取得しますが、たとえば、LIKE 句の末尾に "\" 文字を追加すると (次のように)、行が正しく取得されません。

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\%'

おかしなことに、LIKE 句の先頭に「\」文字を配置すると (次のように)、行が完全に正常に取得されます。これには困惑しています。

SELECT * FROM batches WHERE FilePath LIKE '%\Parker_Apple_Ben_20-10-1956%'
4

6 に答える 6

11

LIKE 内で_は、単一の文字に一致するワイルドカードであるため、潜在的に何かに一致するのではなく、リテラル '_' に正しく一致するようにエスケープする必要があります。さらに、1830 で終わる文字列を 1956 で終わるような文字列と一致させようとしていることに言及しています。最後に、JW と MySQL のドキュメントで言及されているように、バックスラッシュを 2 回エスケープする必要があります。

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

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

試す

SELECT * FROM batches 
WHERE FilePath LIKE '%Parker\_Apple\_Ben\_20-10-1830\\\\%'

http://sqlfiddle.com/#!2/3ce74/3

于 2013-04-04T12:09:18.817 に答える
3

\現在のクエリエスケープを追加して、%これを試してください

SELECT * FROM batches WHERE FilePath LIKE '%Parker\_Apple\_Ben\_20-10-1956\\\\%'

「\」を検索するには、「\\\\」と指定します。これは、バックスラッシュがパーサーによって 1 回削除され、パターン マッチが行われたときに再び削除されるためです。

于 2013-04-04T11:58:37.443 に答える
2

四重エスケープを使用します。

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\\\\%'

説明はこちら

于 2013-04-04T12:00:26.540 に答える
0

これは\%、MySQL のエスケープ文字であるためです。詳細については、次を参照してください。

https://stackoverflow.com/a/881208/1666167

于 2013-04-04T11:58:38.270 に答える
0

\、'、_ などの特殊文字は、mysql のよう\\にエスケープする必要があります\'\_

于 2013-04-04T12:00:03.730 に答える
0

「\」文字をエスケープする必要があります。これを試して:

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\\%'
于 2013-04-04T11:58:08.240 に答える