摘自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的替代吗?
答案 0 :(得分:3)
一切都将以安全的方式创建SQL语句,以最大限度地减少SQL注入的可能性。
您应该始终%q
优先于%s
。
%q
选项的作用类似于%s
,因为它替换了参数列表中以空字符结尾的字符串。但%q
也会使每个'\''
字符加倍。%q
旨在用于字符串文字内。通过将每个'\''
字符加倍,它会转义该字符,并允许将其插入字符串中。
%Q
比%q
具有更多优势。
%Q选项的作用类似于%q,除了它还在整个字符串的外部添加单引号。此外,如果参数列表中的参数是NULL指针,%Q将替换文本“NULL”(不带单引号)。
这意味着它将添加单引号,并将nul指针呈现为字符串中的字符串文字"NULL"
。
正如您所看到的,这取决于您想要做什么。如果您可以添加单引号和"NULL"
生成行为,则只需使用%Q
(我认为它对SQL语句中的参数值非常有意义)。也许有时你不想要这种行为然后你可以回到%q
。