Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlite3\u mprintf-我应该始终使用%Q作为格式说明符而不是%s吗?_Sqlite - Fatal编程技术网

sqlite3\u mprintf-我应该始终使用%Q作为格式说明符而不是%s吗?

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而

摘自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而不是%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