小巧。快速。可靠。
请选择任意三个。

SQLite C 接口

数据库连接配置选项

#define SQLITE_DBCONFIG_MAINDBNAME            1000 /* const char* */
#define SQLITE_DBCONFIG_LOOKASIDE             1001 /* void* int int */
#define SQLITE_DBCONFIG_ENABLE_FKEY           1002 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_TRIGGER        1003 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */
#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      1006 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_QPSG           1007 /* int int* */
#define SQLITE_DBCONFIG_TRIGGER_EQP           1008 /* int int* */
#define SQLITE_DBCONFIG_RESET_DATABASE        1009 /* int int* */
#define SQLITE_DBCONFIG_DEFENSIVE             1010 /* int int* */
#define SQLITE_DBCONFIG_WRITABLE_SCHEMA       1011 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE    1012 /* int int* */
#define SQLITE_DBCONFIG_DQS_DML               1013 /* int int* */
#define SQLITE_DBCONFIG_DQS_DDL               1014 /* int int* */
#define SQLITE_DBCONFIG_ENABLE_VIEW           1015 /* int int* */
#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    1016 /* int int* */
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA        1017 /* int int* */
#define SQLITE_DBCONFIG_STMT_SCANSTATUS       1018 /* int int* */
#define SQLITE_DBCONFIG_REVERSE_SCANORDER     1019 /* int int* */
#define SQLITE_DBCONFIG_MAX                   1019 /* Largest DBCONFIG */

这些常量是可用的整型配置选项,可以作为第二个参数传递给 sqlite3_db_config() 接口。

SQLite 的未来版本可能会添加新的配置选项。现有的配置选项可能会被弃用。应用程序应该检查 sqlite3_db_config() 的返回值以确保调用成功。如果调用了已弃用或不支持的配置选项,sqlite3_db_config() 接口将返回非零的 错误代码

SQLITE_DBCONFIG_LOOKASIDE
此选项接受三个额外的参数,它们决定了 备用内存分配器 的配置 数据库连接。第一个参数(sqlite3_db_config() 的第三个参数)是指向用于备用内存的内存缓冲区的指针。SQLITE_DBCONFIG_LOOKASIDE 谓词后的第一个参数可以是 NULL,在这种情况下,SQLite 将使用 sqlite3_malloc() 自行分配备用缓冲区。第二个参数是每个备用缓冲区槽的大小。第三个参数是槽的数量。第一个参数中缓冲区的大小必须大于或等于第二个参数和第三个参数的乘积。缓冲区必须与 8 字节边界对齐。如果 SQLITE_DBCONFIG_LOOKASIDE 的第二个参数不是 8 的倍数,它将在内部向下舍入到下一个较小的 8 的倍数。数据库连接的备用内存配置只能在该连接当前未使用备用内存时更改,或者换句话说,当 sqlite3_db_status(D,SQLITE_DBSTATUS_LOOKASIDE_USED,...) 返回的“当前值”为零时。当备用内存正在使用时,任何尝试更改备用内存配置都会使配置保持不变并返回 SQLITE_BUSY

SQLITE_DBCONFIG_ENABLE_FKEY
此选项用于启用或禁用 外键约束 的强制执行。应该有两个额外的参数。第一个参数是一个整数,值为 0 表示禁用 FK 强制执行,正数表示启用 FK 强制执行,负数表示保持 FK 强制执行设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后 FK 强制执行是关闭还是开启。第二个参数可以是 NULL 指针,在这种情况下,FK 强制执行设置不会被报告回来。

SQLITE_DBCONFIG_ENABLE_TRIGGER
此选项用于启用或禁用 触发器。应该有两个额外的参数。第一个参数是一个整数,值为 0 表示禁用触发器,正数表示启用触发器,负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后触发器是禁用还是启用。第二个参数可以是 NULL 指针,在这种情况下,触发器设置不会被报告回来。

最初,此选项禁用了所有触发器。但是,从 SQLite 版本 3.35.0 开始,即使此选项关闭,TEMP 触发器仍然允许。因此,换句话说,此选项现在只禁用主数据库模式或附加数据库模式中的触发器。

SQLITE_DBCONFIG_ENABLE_VIEW
此选项用于启用或禁用 视图。应该有两个额外的参数。第一个参数是一个整数,值为 0 表示禁用视图,正数表示启用视图,负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后视图是禁用还是启用。第二个参数可以是 NULL 指针,在这种情况下,视图设置不会被报告回来。

最初,此选项禁用了所有视图。但是,从 SQLite 版本 3.35.0 开始,即使此选项关闭,TEMP 视图仍然允许。因此,换句话说,此选项现在只禁用主数据库模式或附加数据库模式中的视图。

SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
此选项用于启用或禁用 fts3_tokenizer() 函数,该函数是 FTS3 全文搜索引擎扩展的一部分。应该有两个额外的参数。第一个参数是一个整数,值为 0 表示禁用 fts3_tokenizer(),正数表示启用 fts3_tokenizer(),负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后 fts3_tokenizer 是禁用还是启用。第二个参数可以是 NULL 指针,在这种情况下,新设置不会被报告回来。

SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
此选项用于独立于 load_extension() SQL 函数启用或禁用 sqlite3_load_extension() 接口。 sqlite3_enable_load_extension() API 启用或禁用 C-API sqlite3_load_extension() 和 SQL 函数 load_extension()。应该有两个额外的参数。当此接口的第一个参数为 1 时,则仅启用 C-API,而 SQL 函数保持禁用状态。如果此接口的第一个参数为 0,则 C-API 和 SQL 函数都将被禁用。如果第一个参数为 -1,则不会对 C-API 或 SQL 函数的状态进行任何更改。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后 sqlite3_load_extension() 接口是禁用还是启用。第二个参数可以是 NULL 指针,在这种情况下,新设置不会被报告回来。

SQLITE_DBCONFIG_MAINDBNAME
此选项用于更改“主”数据库模式的名称。唯一的参数是指向常量 UTF8 字符串的指针,该字符串将成为“main”的新的模式名称。SQLite 不会复制新的主模式名称字符串,因此应用程序必须确保传递到此 DBCONFIG 选项的参数在数据库连接关闭之前保持不变。

SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
通常,当数据库以 wal 模式关闭或从数据库句柄中分离时,SQLite 会检查这是否意味着现在没有连接到数据库。如果是,它会在关闭连接之前执行检查点操作。此选项可用于覆盖此行为。传递到此操作的第一个参数是一个整数 - 正数表示禁用关闭时的检查点,或零(默认值)表示启用检查点,负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示关闭时的检查点是否已被禁用 - 0 表示未禁用,1 表示已禁用。

SQLITE_DBCONFIG_ENABLE_QPSG
SQLITE_DBCONFIG_ENABLE_QPSG 选项激活或停用 查询规划器稳定性保证 (QPSG)。当 QPSG 激活时,单个 SQL 查询语句将始终使用相同的算法,而与 绑定参数 的值无关。QPSG 禁用了查看绑定参数的值的一些查询优化,这可能会使某些查询变慢。但 QPSG 的优点是行为更可预测。在 QPSG 激活的情况下,SQLite 将始终在现场使用与在实验室测试时相同的查询计划。

SQLITE_DBCONFIG_TRIGGER_EQP
默认情况下,EXPLAIN QUERY PLAN 命令的输出不包括由触发器程序执行的任何操作的输出。此选项用于设置或清除(默认值)控制此行为的标志。传递到此操作的第一个参数是一个整数 - 正数表示启用触发器程序的输出,或零表示禁用它,或负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示触发器的输出是否已被禁用 - 0 表示未禁用,1 表示已禁用。

SQLITE_DBCONFIG_RESET_DATABASE
设置 SQLITE_DBCONFIG_RESET_DATABASE 标志,然后运行 VACUUM 以将数据库重置为一个没有模式且没有内容的空数据库。以下过程即使对于严重损坏的数据库文件也有效。
  1. 如果数据库连接是新打开的,请确保它已通过准备然后丢弃针对数据库的一些查询来读取数据库模式,或者调用 sqlite3_table_column_metadata(),忽略任何错误。此步骤仅在应用程序希望在重置后将数据库保留在 WAL 模式下(如果它在重置之前处于 WAL 模式下)时才需要。
  2. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
  3. sqlite3_exec(db, "VACUUM", 0, 0, 0);
  4. sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0);
因为重置数据库是破坏性的且不可逆的,所以该过程需要使用此模糊的 API 并进行多个步骤,以帮助确保它不会意外发生。由于此功能必须能够重置损坏的数据库,并且关闭虚拟表可能需要访问该损坏的存储,因此库必须放弃任何已安装的虚拟表,而不调用其 xDestroy() 方法。

SQLITE_DBCONFIG_DEFENSIVE
SQLITE_DBCONFIG_DEFENSIVE 选项激活或停用数据库连接的“防御性”标志。当防御性标志启用时,允许普通 SQL 故意损坏数据库文件的语言功能将被禁用。禁用的功能包括但不限于以下内容:

SQLITE_DBCONFIG_WRITABLE_SCHEMA
SQLITE_DBCONFIG_WRITABLE_SCHEMA 选项激活或停用“writable_schema”标志。这与设置 PRAGMA writable_schema=ONPRAGMA writable_schema=OFF 具有相同的效果,并且在逻辑上等效。此设置的第一个参数是一个整数,值为 0 表示禁用 writable_schema,正数表示启用 writable_schema,负数表示保持设置不变。第二个参数是指向整数的指针,其中写入 0 或 1,以指示在本次调用后 writable_schema 是启用还是禁用。

SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 选项激活或停用 ALTER TABLE RENAME 命令的旧行为,使其像在 版本 3.24.0(2018-06-04)之前那样工作。有关更多信息,请参阅 ALTER TABLE RENAME 文档 上的“兼容性注意事项”。此功能也可以使用 PRAGMA legacy_alter_table 语句打开和关闭。

SQLITE_DBCONFIG_DQS_DML
SQLITE_DBCONFIG_DQS_DML 选项仅为 DML 语句激活或停用旧的 双引号字符串文字 错误功能,即 DELETE、INSERT、SELECT 和 UPDATE 语句。此设置的默认值由 -DSQLITE_DQS 编译时选项确定。

SQLITE_DBCONFIG_DQS_DDL
SQLITE_DBCONFIG_DQS 选项用于启用或禁用 DDL 语句(例如 CREATE TABLE 和 CREATE INDEX)中过时的 双引号字符串文字 功能。此设置的默认值由 -DSQLITE_DQS 编译时选项决定。

SQLITE_DBCONFIG_TRUSTED_SCHEMA
SQLITE_DBCONFIG_TRUSTED_SCHEMA 选项告诉 SQLite 假设数据库模式不受恶意内容的影响。当禁用 SQLITE_DBCONFIG_TRUSTED_SCHEMA 选项时,SQLite 会采取额外的防御措施来保护应用程序免受攻击,包括此设置默认情况下为“开启”,以保持向后兼容性,但是建议所有应用程序尽可能将其关闭。此设置也可以使用 PRAGMA trusted_schema 语句控制。

SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 选项用于启用或禁用过时的文件格式标志。启用此标志后,所有新创建的数据库文件将具有模式格式版本号(位于数据库头部的偏移量 44 处的 4 字节整数)为 1。这反过来意味着结果数据库文件将可读写由任何 SQLite 版本(回溯到 3.0.0(2004-06-18))访问。没有此设置,新创建的数据库通常不能被早于 3.3.0(2006-01-11)的 SQLite 版本理解。正如这些文字所写,现在几乎没有必要生成与 3.0.0 版本完全向后兼容的数据库文件,因此此设置几乎没有实际用途,但它是为了让 SQLite 能够继续声称能够生成与 3.0.0 版本兼容的新数据库文件而提供的。

请注意,当 SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 设置开启时,当尝试处理具有生成列和降序索引的表时,VACUUM 命令将失败,并出现一个难以理解的错误。这并不被视为错误,因为 SQLite 3.3.0 及更早版本不支持生成列或降序索引。

SQLITE_DBCONFIG_STMT_SCANSTATUS
SQLITE_DBCONFIG_STMT_SCANSTATUS 选项仅在 SQLITE_ENABLE_STMT_SCANSTATUS 构建中有效。在这种情况下,它设置或清除一个标志,该标志用于启用 sqlite3_stmt_scanstatus_v2() 统计信息的收集。要收集统计信息,必须在准备 SQL 语句和执行语句时在数据库句柄上设置该标志。该标志默认情况下为设置(启用统计信息收集)。此选项接受两个参数:一个整数和一个指向整数的指针。第一个参数为 1、0 或 -1,分别表示启用、禁用或保持不变语句扫描状态选项。如果第二个参数不为空,则在处理第一个参数后,语句扫描状态设置的值将写入第二个参数指向的整数中。

SQLITE_DBCONFIG_REVERSE_SCANORDER
SQLITE_DBCONFIG_REVERSE_SCANORDER 选项更改表和索引扫描的默认顺序,以便扫描从末尾开始,向开头方向进行,而不是从开头开始,向末尾方向进行。设置 SQLITE_DBCONFIG_REVERSE_SCANORDER 与设置 PRAGMA reverse_unordered_selects 相同。此选项接受两个参数,它们分别是整数和指向整数的指针。第一个参数为 1、0 或 -1,分别表示启用、禁用或保持不变反向扫描顺序标志。如果第二个参数不为空,则在处理第一个参数后,将向第二个参数指向的整数写入 0 或 1,具体取决于反向扫描顺序标志是否设置。

另请参见 对象常量函数 列表。