0

SQLiteデータベースの入力をサニタイズしようとしsqlite3_mprintfていて、それを使用していますが、奇妙な結果が得られています。さまざまなバリエーションを試しましたが、何か間違ったことをしていますか?

const char * zChar = "It's a nice day";
cout << sqlite3_mprintf("INSERT INTO table(col1) VALUES('%Q')", zChar) << endl;
//INSERT INTO table(col1) VALUES(''It''s a nice day'')

cout << sqlite3_mprintf("INSERT INTO table(col1) VALUES(%Q)", zChar) << endl;
//INSERT INTO table(col1) VALUES('It''s a nice day')

cout << sqlite3_mprintf("INSERT INTO table(col1) VALUES('%q')", zChar) << endl;
//INSERT INTO table(col1) VALUES('It''s a nice day')

cout << sqlite3_mprintf("INSERT INTO table(col1) VALUES(%q)", zChar) << endl;
//INSERT INTO table(col1) VALUES(It''s a nice day)
4

2 に答える 2

3
sqlite3_mprintf("INSERT INTO table(col1) VALUES(%Q)", zChar)
//INSERT INTO table(col1) VALUES('It''s a nice day')

sqlite3_mprintf("INSERT INTO table(col1) VALUES('%q')", zChar)
//INSERT INTO table(col1) VALUES('It''s a nice day')

これらはどちらも正しいです。''エスケープされた引用です。この%Qオプションは、周囲の引用符自体を追加するだけです。

于 2013-03-21T19:07:15.813 に答える
1

ドキュメントによると、これは予想される動作です。ドキュメントには、次のようにも記載されています。

原則として、テキストを文字列リテラルに挿入するときは、常に %s ではなく %q を使用する必要があります。

于 2013-03-21T19:06:58.317 に答える