ホームページ >データベース >mysql チュートリアル >MySQL では、LIKE クエリではバックスラッシュの二重エスケープが必要ですが、等価比較では必要ないのはなぜですか?
MySQL エスケープ文字と LIKE 演算子: ''
を二重エスケープする理由 次の MySQL クエリを考えてみましょう:
(SELECT * FROM `titles` WHERE title = 'test\') UNION ALL (SELECT * FROM `titles` WHERE title LIKE 'test\\')
結果は、追加のクエリがあったにもかかわらず、両方のクエリが「test」タイトルの行と正常に一致したことを示しています。 LIKE 句 ('test\') にバックスラッシュが追加されます。この動作により、追加のバックスラッシュ () が LIKE 演算子には必要で、= (イコール) 演算子には必要ないのはなぜですか?
文字列リテラルでの '' のエスケープ
MySQL は文字列内のエスケープ文字として文字 ('') を利用します。これは、次の文字が特別な意味を持つことを示します。リテラルの「test」では、バックスラッシュ文字自体がバックスラッシュによってエスケープされ、実際の文字列として「test」が生成されます。この動作は、ほとんどのプログラミング言語および SQL 実装と一致しています。
LIKE 演算子とエスケープ文字
LIKE 演算子は、文字列のパターン マッチング用に設計されています。ただし、MySQL は特にバックスラッシュ () をワイルドカード文字として指定し、任意の 1 文字と一致します。リテラルのバックスラッシュ () を文字として扱うにはエスケープする必要があるため、この動作により潜在的な競合が発生します。
この競合を解決するために、MySQL は LIKE パターンで使用される場合にバックスラッシュ文字に二重エスケープを適用します。これは、パターン内のすべてのバックスラッシュをリテラルのバックスラッシュとして扱うために 2 つにする必要があることを意味します。たとえば、パターン「test」は「test」を含む文字列と一致し、「test\」は「test」を含む文字列と一致します。
エスケープ文字の変更
デフォルトLIKE 演算子のエスケープ文字は、ESCAPE 句を使用して変更できます。たとえば、次のクエリでは '|' が使用されます。エスケープ文字として使用すると、単一のバックスラッシュをリテラルとして扱うことができます:
SELECT * FROM `titles` WHERE title LIKE 'test\' ESCAPE '|'
結論
LIKE パターンのバックスラッシュ文字に対する MySQL の二重エスケープ メカニズムが必要ですバックスラッシュのワイルドカード動作との競合を避けるため。通常の文字列エスケープでは単一レベルのエスケープが適用されますが、LIKE 演算子ではリテラルのバックスラッシュとワイルドカード パターンを区別するために二重エスケープが必要です。この動作を理解すると、MySQL で LIKE 演算子を使用するときに正確なパターン マッチングが保証されます。
以上がMySQL では、LIKE クエリではバックスラッシュの二重エスケープが必要ですが、等価比較では必要ないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。