6

sqlite3_mprintf()APIのSQLiteリファレンスからの抜粋

http://www.sqlite.org/c3ref/mprintf.html

「%Qオプションは、合計文字列の外側に一重引用符を追加することを除いて、%qと同様に機能します。さらに、引数リストのパラメーターがNULLポインターの場合、%Qはテキスト「NULL」(一重引用符なし)に置き換えます。 。」

%qを使用するときは、常に一重引用符を使用するように注意する必要があります。

char *zText = "It's a happy day!";
char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);

次のように、%qの代わりに常に%Qを使用する方が便利なようです。

char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);

私の質問-'%q'がより適切またはより効率的な有効なユースケースはありますか?または、すべてのステートメントで%sの代わりに%Qを安全に使用できますか?

4

1 に答える 1

4

SQLインジェクションの可能性を最小限に抑えるために、すべてが安全な方法でSQLステートメントを作成しようとしています。

%qあなたはいつもよりも好むべき%sです。

この%qオプション%sは、引数リストのヌル終了文字列を置き換えるという点で同じように機能します。しかし、すべての文字%qも2倍になります。文字列リテラル内で使用するように設計されています。各文字を2倍にすることで、その文字をエスケープし、文字列に挿入できるようにします。'\''%q'\''

には、さらに%Qいくつかの利点があり%qます。

%Qオプションは、合計文字列の外側に一重引用符を追加することを除いて、%qと同様に機能します。さらに、引数リストのパラメーターがNULLポインターの場合、%Qはテキスト「NULL」を(一重引用符なしで)置き換えます。

これは、一重引用符を追加し、文字列"NULL"内の文字列リテラルとしてnulポインタをレンダリングすることを意味します。

ご覧のとおり、それはあなたが何をしたいかによります。一重引用符を追加してその"NULL"生成動作に問題がない場合は、単純に使用できます%Q(SQLステートメントのパラメーター値には非常に意味があると思います)。たぶん時々あなたはこの振る舞いを望まないでしょうそしてあなたはにフォールバックすることができます%q

于 2012-11-10T10:31:49.750 に答える