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

4

1 回答 1

4

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

%q你应该一直都喜欢%s

%q选项的工作方式类似于%s它从参数列表中替换一个以 nul 结尾的字符串。但也使每个字符%q加倍。设计用于在字符串文字中使用。通过将每个字符加倍,它会转义该字符并允许将其插入字符串中。'\''%q'\''

%Q相比%q. _

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

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

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

于 2012-11-10T10:31:49.750 回答