sqlite3\u mprintf-我应该始终使用%Q作为格式说明符而不是%s吗?
摘自sqlite3_mprintf()API上的SQLite参考 %Q选项的工作原理与%Q类似,只是它还在整个字符串的外部添加了单引号。此外,如果参数列表中的参数是空指针,%Q将替换文本“NULL”(不带单引号) 当使用%q时,我们必须小心始终在其周围使用单引号,例如sqlite3\u mprintf-我应该始终使用%Q作为格式说明符而不是%s吗?,sqlite,Sqlite,摘自sqlite3_mprintf()API上的SQLite参考 %Q选项的工作原理与%Q类似,只是它还在整个字符串的外部添加了单引号。此外,如果参数列表中的参数是空指针,%Q将替换文本“NULL”(不带单引号) 当使用%q时,我们必须小心始终在其周围使用单引号,例如 char *zText = "It's a happy day!"; char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText); 始终使用%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吗?一切都将以安全的方式创建SQL语句,以最小化SQL注入的可能性 您应该始终更喜欢
%q
而不是%s
%q
选项的工作原理类似于%s
,它从参数列表中替换以nul结尾的字符串。但是%q
也会使每个'\''
字符加倍<代码>%q是为在字符串文本中使用而设计的。通过将每个'\''字符加倍,它将转义该字符并允许将其插入字符串中
%Q
比%Q
有更多的优势
%Q选项的工作原理与%Q类似,只是它还在整个字符串的外部添加了单引号。此外,如果参数列表中的参数是空指针,%Q将替换文本“NULL”(不带单引号)
这意味着它将添加单引号,并将nul指针呈现为字符串文本“NULL”
正如你所看到的,这取决于你想做什么。如果您可以添加单引号,并且“NULL”
生成行为,那么只需使用%Q
(我认为这对于SQL语句中的参数值非常有意义)。也许有时候你不想要这种行为,那么你可以回到%q