有没有用于引用/转义表名称的C SQLite API?

这是不可能的sqlite3_bind_text表名,因为sqlite3_prepare_v2无法准备一个语句,如:

SELECT * FROM ? ;

我认为需要表名来解析语句,所以引用需要在sqlite3_prepare_v2之前发生。

有没有像sqlite3_quote_tablename ? 也许它已经存在于我无法识别的名称下,但我在函数列表中找不到任何东西。


你提出的sqlite3_quote_tablename函数可以清理输入以防止sql注入攻击。 要做到这一点,它可以解析输入以确保它是一个字符串文字。 http://sqlite.org/lang_expr.html#litvalue


如果表名中包含无效字符,可以用双引号括起表名,就像这样。

sqlite> create table "test table" (id);
sqlite> insert into "test table" values (1);
sqlite> select * from "test table";
id
----------
1

当然你应该尽可能避免使用无效字符。 它使开发复杂化并且几乎总是不必要的(IMO唯一需要的时候是当你继承一个已经这样完成的项目并且它太大而不能改变时)。


当使用带参数的SQLite准备好的语句时,参数:“在表达式中为运行时填充的文字值指定占位符”

在执行任何SQL语句之前,SQLite会将SQL字符串“编译”为一系列由内部虚拟机执行的操作码。 SQL语句在其上运行的表名和列名是编译过程的必要部分。

您可以使用参数将“值”绑定到准备好的语句,如下所示:

SELECT * FROM FOO WHERE name=?;

然后调用sqlite3_bind_text()将字符串gavinbeatty绑定到已编译的语句。 但是,这种体系结构意味着你不能使用这样的参数:

SELECT * FROM ? WHERE name=?;    // Can't bind table name as a parameter
SELECT * FROM FOO WHERE ?=10;    // Can't bind column name as a parameter
链接地址: http://www.djcxy.com/p/44553.html

上一篇: Is there any C SQLite API for quoting/escaping the name of a table?

下一篇: Ways to accidentally create temporary objects in C++?