MySQLでバックスラッシュの入った文字列を比較する際の注意点

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’ と指定します。‘\’ の検索には、‘\\\\’ と指定します。これは、バックスラッシュがパーサによってストリップされ、そしてパターンのマッチが実行された時にもストリップされるため、ひとつのバックスラッシュを残してマッチさせるためです。( 例外 :パターン ストリングの最後では、バックスラッシュは ‘\\’ と指定できます。ストリングの末尾では、エスケープの後に連なるものがないため、バックスラッシュはそのもので独立することができます ) 。
Categorized: MySQL

Comments are closed.