(CakePHP,PHP,SQLite3,MySQL) SQLで"%"や"_"をエスケープしたい

SQLワイルドカードとして扱われる"%(パーセント)"や"_(アンダーバー)"そのものを検索したい場合、自前でエスケープしなければなりません。


CakePHPと素のPHPそれぞれでMySQLとSQLite3からデータを検索する場合を考えてみます。
基本的には

  1. 自前で"%"や"_"をエスケープ
  2. それをPHPの関数でエスケープ
という手順で解決できるのですが、『CakePHP + MySQL』の場合は、内部の処理を確認していないので詳しくは分かりませんが、上記とは逆の手順でなければダメでした。
また、"\(バックスラッシュ)"自体をエスケープする必要はありません。


SQLite3では、LIKE演算子の後にESCAPE節が必要ですが、SQLite2ではESCAPE節を使うことができません。
SQLite2では、ワイルドカード用の文字を検索で使うことはできないのでしょうか・・・?


【参考】
PHPmysql_real_escape_string は % と _ 記号をエスケープしない - futuremix
http://futuremix.org/2010/09/php_mysql_real_escape_string_and_select_like_query_escape


素のPHP5.3 + SQLite3

(PHP)
$str = sqlite_escape_string(
str_replace(
array('\\', '%', '_'),
array('\\\\', '\%', '\_'),
$str
)
);

(SQL)
SELECT * FROM tbl WHERE name LIKE (文字列) ESCAPE '\';

(エスケープの結果)
' -> ''
\ -> \\
% -> \%
_ -> \_


素のPHP5.3 + MySQL

(PHP)
$str = mysql_escape_string(
str_replace(
array('\\', '%', '_'),
array('\\\\', '\%', '\_'),
$str
)
);

(SQL)
SELECT * FROM tbl WHERE name LIKE (文字列);

(エスケープの結果)
' -> \'
\ -> \\\\
% -> \\%
_ -> \\_


CakePHP2.2.0 + SQLite3

(PHP)
$str = sqlite_escape_string(
str_replace(
array('\\', '%', '_'),
array('\\\\', '\%', '\_'),
$str
)
);

(SQL)
SELECT * FROM tbl WHERE name LIKE (文字列) ESCAPE '\';

(エスケープの結果)
' -> ''
\ -> \\
% -> \%
_ -> \_


CakePHP2.2.0 + MySQL

(PHP)
$str = str_replace(
array('%', '_'),
array('\%', '\_'),
mysql_escape_string($str)
);

(SQL)
SELECT * FROM tbl WHERE name LIKE (文字列);

(エスケープの結果)
' -> \'
\ -> \\
% -> \%
_ -> \_