(CakePHP,PHP,SQLite3,MySQL) SQLで"%"や"_"をエスケープしたい
SQLでワイルドカードとして扱われる"%(パーセント)"や"_(アンダーバー)"そのものを検索したい場合、自前でエスケープしなければなりません。
CakePHPと素のPHPそれぞれでMySQLとSQLite3からデータを検索する場合を考えてみます。
基本的には
また、"\(バックスラッシュ)"自体をエスケープする必要はありません。
SQLite3では、LIKE演算子の後にESCAPE節が必要ですが、SQLite2ではESCAPE節を使うことができません。
SQLite2では、ワイルドカード用の文字を検索で使うことはできないのでしょうか・・・?
【参考】
PHP の mysql_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 (文字列);(エスケープの結果)
' -> \'
\ -> \\
% -> \%
_ -> \_