SQLite3というサーバー要らずのDBエンジンはパーソナルにSQLを使用するのに手軽です。また、最近の多くのモバイル・デバイスの内部でも使用されています。
ということでMac OS X上でもiOSアプリ内(最近はCoreDataに移行中ですが)でも多用しています。単純な単語の場合は問題ありませんが特殊文字も含めてqueryする場合には文字のエスケープを行わなればなりません。iOSアプリの内部で多様な文字列のqueryを行う必要が出てきたために文字列のエスケープについてまとめてみました。
[ LIKE operatorの場合 ]
標準的なSQLで使用されるLIKEと同じです。ワイルドカードとして%(0個以上の任意の文字に一致)と_(任意の一文字に一致)が使用できます。そのため%と_自身をマッチさせるためにはエスケープ文字の指定が必要です。 エスケープ文字の指定にはESCAPE節を使用します。
SELECT * FROM hoge WHERE key LIKE '% test^_case %' ESCAPE '^';
という具合に使用します。ESCAPEで指定した文字自体もエスケープ対象になります。
引用符の扱いはperlと同様です。
– シングルクォート ‘ で囲まれた文字列の中ではダブルクォート ” は自由に使用できる。
– ダブルクォート ” で囲まれた文字列の中ではシングルクォート ‘ は自由に使用できる。
– シングルクォートとダブルクォートが混在する場合には囲み文字自体でエスケープ出来る。
SELECT * FROM hoge WHERE key LIKE 'I''m reading the "SNOW WHITE"';
[ GLOB operatorの場合 ]
GLOBはSQLiteに特有なオペレーターです。正規表現的な表現を使用しLIKEより柔軟なパターンマッチングが行えます。またLIKEは大文字小文字の区別がありませんがGLOBでは大文字小文字を区別します。
ここではエスケープについてだけ書きます。エスケープしなければならない文字は [ ] * ? です。エスケープの方法は、それぞれを[]で囲みます。
SELECT * FROM hoge WHERE key GLOB 'How are you[?] *';
といった具合になります。'[Y/n]’のように[]自体が含まれる文字列のマッチングも同様です。
SELECT * FROM hoge WHERE key GLOB '[[]Y/n[]]';
引用符の扱いはLIKEと同じです。
no comment untill now