LIKE用メタ文字のエスケープ
SQLiteでもLIKEは使え、%と_がメタ文字になります。%は任意の複数文字、_は任意の一文字に相当。
ここでPerlとかだと\がエスケープ文字で、%や_自体を検索したいときは「\%」等とすればいいはずですが。でもSQLiteには既定のエスケープ文字がないそうで、どれをエスケープ文字に使うか明示しないといけないらしい。こんなふうに。
SELECT * FROM D_SITE WHERE NAME LIKE 'abc\%あいう' ESCAPE '\'
(\をエスケープ文字として使用)
もちろんパターンに%や_が含まれていなければESCAPEを指定する必要もないわけで、さらにエスケープ文字を任意に指定するようにするとなると、こんな感じでしょうか。
function sqlescape($str, $escapechar='$', $encoding='UTF-8') {
mb_regex_encoding($encoding);
$escape = preg_match('/[%_]/', $str);
if ($escape) $str = mb_ereg_replace('([%_'.$escapechar.'])', $escapechar.'\1', $str);
return array('str'=>sqlite_escape_string($str), 'escape'=>$escape);
}
エスケープした結果の文字列(戻り値の先頭要素)と、ESCAPE指定が必要か否か(戻り値の二番目の要素)を返します。
何も考えず、機械的にESCAPE指定をつけとけばいいじゃん、って感じですが、本当かどうかESCAPEをつけると遅くなるという報告もどこかで見たので。
2010/10/21 23:10:29更新
最終更新:2010年10月21日 23:10