MySQLを使っていて、次の2つの文字列比較
- = で比較する場合
- Likeで比較する場合
でバックスラッシュの入った文字列を検索する場合、で \ の数が違いました。
= で比較の場合、2重にすることでマッチする
mysql> select 'foo\\bar' = 'foo\\bar'; +-------------------------+ | 'foo\\bar' = 'foo\\bar' | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec)
= で比較の場合、4重にするとマッチしない
mysql> select 'foo\\bar' = 'foo\\\\bar'; +---------------------------+ | 'foo\\bar' = 'foo\\\\bar' | +---------------------------+ | 0 | +---------------------------+ 1 row in set (0.00 sec)
like で比較の場合、2重だとマッチしない
mysql> select 'foo\\bar' like '%\\%'; +------------------------+ | 'foo\\bar' like '%\\%' | +------------------------+ | 0 | +------------------------+ 1 row in set (0.00 sec)
like で比較の場合、4重だとマッチする
mysql> select 'foo\\bar' like '%\\\\%'; +--------------------------+ | 'foo\\bar' like '%\\\\%' | +--------------------------+ | 1 | +--------------------------+ 1 row in set (0.02 sec)
MySQLのマニュアルにありました。
注記 :MySQL は C エスケープ構文をストリングで使用するため ( 例えば、‘\n’ で改行文字を表現 ) 、LIKE ストリングで使用する ‘\’ はすべて二重にする必要があります。例えば、‘\n’ を検索するには、‘\\n’ と指定します。‘\’ の検索には、‘\\\\’ と指定します。これは、バックスラッシュがパーサによってストリップされ、そしてパターンのマッチが実行された時にもストリップされるため、ひとつのバックスラッシュを残してマッチさせるためです。( 例外 :パターン ストリングの最後では、バックスラッシュは ‘\\’ と指定できます。ストリングの末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます ) 。