sqlite3_mprintf - 我应该总是使用%Q作为格式说明符而不是%s吗?

时间:2012-05-09 18:39:31

标签: sqlite

摘自SQLite对sqlite3_mprintf()API的引用

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'更合适或更有效的有效用例?或者我可以安全地使用%Q作为所有语句中%s的替代吗?

1 个答案:

答案 0 :(得分:3)

一切都将以安全的方式创建SQL语句,以最大限度地减少SQL注入的可能性。

您应该始终%q优先于%s

  

%q选项的作用类似于%s,因为它替换了参数列表中以空字符结尾的字符串。但%q也会使每个'\''字符加倍。 %q旨在用于字符串文字内。通过将每个'\''字符加倍,它会转义该字符,并允许将其插入字符串中。

%Q%q具有更多优势。

  

%Q选项的作用类似于%q,除了它还在整个字符串的外部添加单引号。此外,如果参数列表中的参数是NULL指针,%Q将替换文本“NULL”(不带单引号)。

这意味着它将添加单引号,并将nul指针呈现为字符串中的字符串文字"NULL"

正如您所看到的,这取决于您想要做什么。如果您可以添加单引号和"NULL"生成行为,则只需使用%Q(我认为它对SQL语句中的参数值非常有意义)。也许有时你不想要这种行为然后你可以回到%q