バックスラッシュ () を含む特殊文字をエスケープするのは、MySQL では一般的な方法です。 、解釈の競合を防ぐためにクエリ内で使用されます。ただし、バックスラッシュに関して等号演算子 (=) と LIKE 演算子の動作を比較すると、奇妙な異常が発生します。
等号演算子の場合、検索語内のバックスラッシュをエスケープするために追加のバックスラッシュは必要ありません。たとえば、次のクエリは、タイトル列に値「test」が含まれる行を取得します。
SELECT * FROM `titles` WHERE title = 'test\';
MySQL パーサーは、検索用語内のバックスラッシュをリテラル文字として自動的に解釈するため、取得は成功します。
等号演算子とは異なり、LIKE 演算子では、検索用語内のバックスラッシュをエスケープするために追加のバックスラッシュが必要です。これは、LIKE 演算子がパターン一致を実行し、バックスラッシュが SQL のデフォルトでエスケープ文字として機能するためです。したがって、次のクエリは前のクエリと同じ行を取得します。
SELECT * FROM `titles` WHERE title LIKE 'test\\';
このクエリでは、二重のバックスラッシュにより、検索用語内の 1 つのバックスラッシュが文字通りバックスラッシュ文字として解釈されることが保証されます。
この動作の背後にある理由は、MySQL が LIKE パターンを処理する方法に根ざしています。パーサーは最初に検索語からバックスラッシュを取り除きます。ただし、その後パターン照合が実行されると、バックスラッシュが再度削除されます。これにより、パターンと照合される単一のバックスラッシュが残ります。バックスラッシュがリテラル文字として扱われるようにするには、追加のバックスラッシュが必要です。
MySQL では、別のエスケープを指定できます。 ESCAPE 句を使用した LIKE パターンの文字。たとえば、次のクエリではエスケープ文字としてパイプ (|) 文字が使用されています:
SELECT * FROM `titles` WHERE title LIKE 'test\' ESCAPE '|';
この例では、指定されたエスケープ文字が前にあるため、検索用語内の 1 つのバックスラッシュは文字通り解釈されます。 .
以上がMySQL では、LIKE クエリではバックスラッシュをエスケープするために 2 つのバックスラッシュが必要ですが、Equals (=) クエリでは必要ないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。