小巧、快速、可靠。
三选二。
编译时选项

1. 概述

对于大多数用途,SQLite 可以使用默认的编译选项正常构建。但是,如果需要,下面记录的编译时选项可用于省略 SQLite 功能(从而导致编译后的库大小更小)或更改某些参数的默认值

我们已尽一切努力确保各种编译选项组合能够和谐地工作并生成可工作的库。但是,强烈建议在使用使用非标准编译选项构建的 SQLite 库之前,执行 SQLite 测试套件以检查错误。

2. 推荐的编译时选项

以下编译时选项推荐用于能够使用它们的应用程序,以最大程度地减少 SQLite 使用的 CPU 周期和内存字节数。并非所有这些编译时选项都可用于每个应用程序。例如,SQLITE_THREADSAFE=0 选项仅可用于一次从未从多个线程访问 SQLite 的应用程序。SQLITE_OMIT_PROGRESS_CALLBACK 选项仅可用于不使用sqlite3_progress_handler() 接口的应用程序。依此类推。

无法测试 SQLite 的每种可能的编译时选项组合。但以下一组编译时选项是一种始终经过全面测试的配置。

  1. SQLITE_DQS=0。此设置禁用双引号字符串文字的错误功能。

  2. SQLITE_THREADSAFE=0。设置 -DSQLITE_THREADSAFE=0 会导致 SQLite 中的所有互斥锁和线程安全逻辑被省略。这是导致 SQLite 运行速度提高约 2% 且库大小减少约 2% 的单个编译时选项。但缺点是,使用此编译时选项意味着 SQLite 永远不能被多个线程同时使用,即使每个线程都有自己的数据库连接。

  3. SQLITE_DEFAULT_MEMSTATUS=0。此设置导致跟踪内存用量的sqlite3_status() 接口被禁用。这有助于sqlite3_malloc() 例程运行得更快,并且由于 SQLite 在内部使用sqlite3_malloc(),因此这有助于使整个库运行得更快。

  4. SQLITE_DEFAULT_WAL_SYNCHRONOUS=1。为了在断电后获得最大的数据库安全性,建议设置PRAGMA synchronous=FULL。但是,在WAL 模式下,使用PRAGMA synchronous=NORMAL 可以保证完整的数据库完整性。在WAL 模式下使用PRAGMA synchronous=NORMAL 时,最近对数据库的更改可能会因断电而回滚,但数据库不会损坏。此外,在 WAL 模式下使用 synchronous=NORMAL 进行事务提交的速度比使用默认的 synchronous=FULL 快得多。出于这些原因,建议在切换到 WAL 模式时将 synchronous 设置从 FULL 更改为 NORMAL。此编译时选项将实现此目的。

  5. SQLITE_LIKE_DOESNT_MATCH_BLOBS。从历史上看,SQLite 允许将 BLOB 操作数用于LIKEGLOB 运算符。但是,将 BLOB 作为LIKEGLOB 的操作数会使LIKE 优化变得复杂并降低速度。设置此选项意味着,如果任一操作数为 BLOB,则 LIKE 和 GLOB 运算符始终返回 FALSE。这简化了LIKE 优化的实现,并允许使用LIKE 优化的查询运行得更快。

  6. SQLITE_MAX_EXPR_DEPTH=0。将最大表达式解析树深度设置为零会禁用对表达式解析树深度的所有检查,这可以简化代码从而导致更快的执行速度,并有助于解析树使用更少的内存。

  7. SQLITE_OMIT_DECLTYPE。通过省略(很少需要)从查询结果集中返回列的声明类型的能力,可以使预处理语句消耗更少的内存。

  8. SQLITE_OMIT_DEPRECATED。省略已弃用的接口和功能不会帮助 SQLite 运行得更快。但是它会减少库占用空间。这是正确的做法。

  9. SQLITE_OMIT_PROGRESS_CALLBACK。进度处理程序回调计数器必须在字节码引擎的内循环中进行检查。通过省略此接口,可以从字节码引擎的内循环中删除一个条件,从而帮助 SQL 语句运行得略快。

  10. SQLITE_OMIT_SHARED_CACHE。省略使用共享缓存的可能性允许消除代码性能关键部分中的许多条件。这可以显着提高性能。

  11. SQLITE_USE_ALLOCA。在支持 alloca() 的系统上,利用 alloca() 为在单个函数中使用动态分配临时堆栈空间。如果没有此选项,则会从堆中分配临时空间。

  12. SQLITE_OMIT_AUTOINIT。SQLite 库需要使用对sqlite3_initialize() 的调用进行初始化,然后才能使用某些接口。此初始化通常在第一次需要时自动发生。但是,使用 SQLITE_OMIT_AUTOINIT 选项会省略自动初始化。这有助于许多 API 调用运行得更快(因为它们不必检查初始化是否已发生,然后在之前未调用初始化的情况下运行初始化),但这也意味着应用程序必须手动调用sqlite3_initialize()。如果 SQLite 使用 -DSQLITE_OMIT_AUTOINIT 进行编译,并且在未首先调用sqlite3_initialize() 的情况下调用了sqlite3_malloc()sqlite3_vfs_find()sqlite3_open() 等例程,则可能的结果是段错误。

  13. SQLITE_STRICT_SUBTYPE=1。此选项会导致如果未具有SQLITE_RESULT_SUBTYPE 属性的应用程序定义函数调用sqlite3_result_subtype() 接口,则引发错误。除非使用 SQLITE_RESULT_SUBTYPE 属性注册该函数,否则 sqlite3_result_subtype() 接口无法可靠地工作。此编译时选项旨在尽早提请开发人员注意此问题。

当使用上述所有推荐的编译时选项时,SQLite 库将大约缩小 3%,并使用约 5% 的 CPU 周期。因此,这些选项不会产生巨大差异。但在某些设计情况下,每一小部分都有帮助。

库级配置选项(例如上面列出的选项)可以选择在客户端头文件中定义。定义 SQLITE_CUSTOM_INCLUDE=myconfig.h(不带引号)将导致 sqlite3.c 在编译过程的早期包含 myconfig.h,使客户端能够自定义标志,而无需显式地将所有标志传递给编译器。

3. 平台配置

_HAVE_SQLITE_CONFIG_H

如果定义了 _HAVE_SQLITE_CONFIG_H 宏,则 SQLite 源代码将尝试 #include 一个名为“sqlite_cfg.h”的文件。“sqlite_cfg.h”文件通常包含其他配置选项,尤其是由 autoconf 脚本生成的“HAVE_INTERFACE”类型选项。请注意,此标头仅用于平台级配置,不用于库级配置。要在自定义标头中设置 SQLite 级配置标志,请定义 SQLITE_CUSTOM_INCLUDE=myconfig.h,如上一节所述。

HAVE_FDATASYNC

如果 HAVE_FDATASYNC 编译时选项为真,则 unix 系统的默认VFS 将尝试在适当的情况下使用 fdatasync() 而不是 fsync()。如果此标志不存在或为假,则始终使用 fsync()。

HAVE_GMTIME_R

如果 HAVE_GMTIME_R 选项为真,并且如果SQLITE_OMIT_DATETIME_FUNCS 为真,则 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 关键字将使用线程安全的“gmtime_r()”接口而不是“gmtime()”。在通常情况下,如果SQLITE_OMIT_DATETIME_FUNCS 未定义或为假,则内置的日期和时间函数用于实现 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 关键字,并且永远不会调用 gmtime_r() 或 gmtime()。

HAVE_ISNAN

如果 HAVE_ISNAN 选项为真,则 SQLite 调用系统库 isnan() 函数来确定双精度浮点值是否为 NaN。如果 HAVE_ISNAN 未定义或为假,则 SQLite 替换其自己的 isnan() 自制实现。

HAVE_LOCALTIME_R

如果 HAVE_LOCALTIME_R 选项为真,则 SQLite 使用线程安全的 localtime_r() 库例程而不是 localtime() 来帮助实现内置日期和时间函数localtime 修饰符

HAVE_LOCALTIME_S

如果 HAVE_LOCALTIME_S 选项为真,则 SQLite 使用线程安全的 localtime_s() 库例程而不是 localtime() 来帮助实现内置日期和时间函数localtime 修饰符

HAVE_MALLOC_USABLE_SIZE

如果 HAVE_MALLOC_USABLE_SIZE 选项为真,则 SQLite 尝试使用 malloc_usable_size() 接口查找从标准库 malloc() 或 realloc() 例程获得的内存分配的大小。此选项仅适用于使用标准库 malloc() 的情况。在 Apple 系统上,使用“zone malloc”,因此此选项不适用。当然,如果应用程序使用SQLITE_CONFIG_MALLOC 提供自己的 malloc 实现,则此选项无效。

如果省略了 HAVE_MALLOC_USABLE_SIZE 选项或该选项为假,则 SQLite 使用围绕系统 malloc() 和 realloc() 的包装器,将每个分配扩大 8 个字节并将分配的大小写入初始 8 个字节,然后 SQLite 还实现了自己的 malloc_usable_size() 自制版本,该版本查询该 8 字节前缀以查找分配大小。这种方法有效,但不是最佳方法。鼓励应用程序尽可能使用 HAVE_MALLOC_USABLE_SIZE。

HAVE_STRCHRNUL

如果 HAVE_STRCHRNUL 选项为真,则 SQLite 使用 strchrnul() 库函数。如果此选项不存在或为假,则 SQLite 替换其自己的 strchrnul() 自制实现。

HAVE_UTIME

如果 HAVE_UTIME 选项为真,则内置但非标准的“unix-dotfile”VFS 将使用 utime() 系统调用而不是 utimes() 来设置锁文件上的上次访问时间。

SQLITE_BYTEORDER=(0|1234|4321)

SQLite 需要知道目标 CPU 的原生字节序是大端还是小端。SQLITE_BYTEORDER 预处理器对于大端机器设置为 4321,对于小端机器设置为 1234,或者可以设置为 0,表示字节序必须在运行时确定。代码中有一些 #ifdef 用于自动为所有常见平台和编译器设置 SQLITE_BYTEORDER。但是,在为模糊的目标编译 SQLite 时,适当地设置 SQLITE_BYTEORDER 可能会有优势。如果目标字节序无法在编译时确定,则 SQLite 会回退到执行运行时检查,这些检查始终有效,但会带来少量性能损失。

4. 设置默认参数值的选项

SQLITE_DEFAULT_AUTOMATIC_INDEX=<0 或 1>

此宏确定为新打开的 PRAGMA automatic_index 数据库连接 的初始设置。对于 3.7.17 及之前的 SQLite 所有版本,如果省略此编译时选项,则通常会为新的数据库连接启用自动索引。但是,这可能会在 SQLite 的未来版本中发生变化。

另请参阅:SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=<0 或 1 或 2>

此宏确定 SQLite 是否默认创建具有 auto_vacuum 标志设置为 OFF (0)、FULL (1) 或 INCREMENTAL (2) 的数据库。默认值为 0,表示数据库创建时自动真空关闭。无论如何,PRAGMA auto_vacuum 命令可以覆盖编译时默认值。

SQLITE_DEFAULT_CACHE_SIZE=<N>

此宏设置每个附加数据库的页面缓存的最大默认大小。正值表示限制为 N 页。如果 N 为负数,则表示将缓存大小限制为 -N*1024 字节。可以使用 PRAGMA cache_size 命令覆盖建议的最大缓存大小。默认值为 -2000,转换为每个缓存最大 2048000 字节。

SQLITE_DEFAULT_FILE_FORMAT=<1 或 4>

SQLite 创建新数据库文件时使用的默认 模式格式编号 由此宏设置。模式格式都非常相似。格式 1 和 4 之间的区别在于格式 4 理解 降序索引 并且对布尔值的编码更紧凑。

自 3.3.0 版(2006-01-10)以来的所有 SQLite 版本都可以读取和写入 1 到 4 之间的任何模式格式。但较旧版本的 SQLite 可能无法读取大于 1 的格式。因此,为了使较旧版本的 SQLite 能够读取和写入新版本 SQLite 创建的数据库文件,对于 3.7.9 版(2011-11-01)之前的 SQLite 版本,默认模式格式设置为 1。从 3.7.10 版(2012-01-16)开始,默认模式格式为 4。

可以使用 PRAGMA legacy_file_format 命令在运行时设置新数据库的模式格式编号。

SQLITE_DEFAULT_FILE_PERMISSIONS=N

Unix 下新创建的数据库文件的默认数字文件权限。如果未指定,则默认为 0644,这意味着文件全局可读,但只有创建者可写。

SQLITE_DEFAULT_FOREIGN_KEYS=<0 或 1>

此宏确定是否默认启用或禁用新数据库连接的 外键约束 强制执行。每个数据库连接始终可以使用 foreign_keys pragma 在运行时打开和关闭外键约束的强制执行。外键约束的强制执行通常默认关闭,但如果此编译时参数设置为 1,则默认情况下会打开外键约束的强制执行。

SQLITE_DEFAULT_MMAP_SIZE=N

此宏设置每个打开的数据库文件用于内存映射 I/O 的内存量的默认限制。如果 N 为零,则默认情况下禁用内存映射 I/O。可以使用 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 调用在启动时修改此编译时限制和 SQLITE_MAX_MMAP_SIZE,或者使用 mmap_size pragma 在运行时修改。

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=<字节>

此选项设置 回滚日志 文件在 持久化日志模式独占锁定模式 中的大小限制,以及 WAL 模式 中预写日志文件的大小。当省略此编译时选项时,回滚日志或预写日志的大小没有上限。可以使用 journal_size_limit pragma 在运行时更改日志文件大小限制。

SQLITE_DEFAULT_LOCKING_MODE=<1 或 0>

如果设置为 1,则默认 locking_mode 设置为 EXCLUSIVE。如果省略或设置为 0,则默认 locking_mode 为 NORMAL。

SQLITE_DEFAULT_LOOKASIDE=SZ,N

备用内存分配器 内存池的默认大小设置为每个 SZ 字节 N 个条目。可以使用 sqlite3_config(SQLITE_CONFIG_LOOKASIDE) 在启动时修改此设置,以及/或者在使用 sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE) 打开每个 数据库连接 时修改。

SQLITE_DEFAULT_MEMSTATUS=<1 或 0>

此宏用于确定是否默认可以使用使用 sqlite3_config() 的 SQLITE_CONFIG_MEMSTATUS 参数启用和禁用的功能。默认值为 1(SQLITE_CONFIG_MEMSTATUS 相关功能已启用)。

sqlite3_memory_used()sqlite3_memory_highwater() 接口、sqlite3_status64(SQLITE_STATUS_MEMORY_USED) 接口以及 SQLITE_MAX_MEMORY 编译时选项在禁用内存使用跟踪时均不起作用。

SQLITE_DEFAULT_PCACHE_INITSZ=N

当未使用 SQLITE_CONFIG_PAGECACHE 配置选项并且页面缓存的内存是从 sqlite3_malloc() 获取时,此宏确定页面缓存模块最初分配的页面数。此宏设置的页面数在一个分配中分配,这减少了内存分配器的负载。

SQLITE_DEFAULT_PAGE_SIZE=<字节>

此宏用于设置创建数据库时使用的默认页面大小。分配的值必须是 2 的幂。默认值为 4096。可以使用 PRAGMA page_size 命令在运行时覆盖编译时默认值。

SQLITE_DEFAULT_SYNCHRONOUS=<0-3>

此宏确定 PRAGMA synchronous 设置的默认值。如果在编译时未覆盖,则默认设置为 2(FULL)。

SQLITE_DEFAULT_WAL_SYNCHRONOUS=<0-3>

此宏确定以 WAL 模式 打开的数据库文件的 PRAGMA synchronous 设置的默认值。如果在编译时未覆盖,则此值与 SQLITE_DEFAULT_SYNCHRONOUS 相同。

如果 SQLITE_DEFAULT_WAL_SYNCHRONOUS 与 SQLITE_DEFAULT_SYNCHRONOUS 不同,并且如果应用程序尚未使用 PRAGMA synchronous 语句修改数据库文件的同步设置,则当数据库连接第一次切换到 WAL 模式时,同步设置将更改为 SQLITE_DEFAULT_WAL_SYNCHRONOUS 定义的值。如果在编译时未覆盖 SQLITE_DEFAULT_WAL_SYNCHRONOUS 值,则它将始终与 SQLITE_DEFAULT_SYNCHRONOUS 相同,因此永远不会发生自动同步设置更改。

SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=<页数>

此宏设置 WAL 自动检查点 功能的默认页面计数。如果未指定,则默认页面计数为 1000。

SQLITE_DEFAULT_WORKER_THREADS=N

此宏设置 SQLITE_LIMIT_WORKER_THREADS 参数的默认值。SQLITE_LIMIT_WORKER_THREADS 参数设置单个 预准备语句 为协助查询而启动的辅助线程的最大数量。如果未指定,则默认最大值为 0。此处设置的值不能超过 SQLITE_MAX_WORKER_THREADS

SQLITE_DQS=N

此宏确定 SQLITE_DBCONFIG_DQS_DDLSQLITE_DBCONFIG_DQS_DML 的默认值,而这些值又决定了 SQLite 如何处理每个 双引号字符串文字。“DQS”名称代表“Double-Quoted String”。N 参数应为整数 0、1、2 或 3。

SQLITE_DQS允许使用双引号字符串备注
在 DDL 中在 DML 中
3默认
2 
1 
0推荐

推荐的设置是 0,表示在所有上下文中都不允许使用双引号字符串。但是,默认设置为 3,以最大程度地与旧版应用程序兼容。

SQLITE_EXTRA_DURABLE

SQLITE_EXTRA_DURABLE 编译时选项用于导致默认 PRAGMA synchronous 设置为 EXTRA,而不是 FULL。此选项不再受支持。请改用 SQLITE_DEFAULT_SYNCHRONOUS=3

SQLITE_FTS3_MAX_EXPR_DEPTH=N

此宏设置与 FTS3FTS4 全文索引中 MATCH 运算符的右侧对应的搜索树的最大深度。全文搜索使用递归算法,因此树的深度受到限制,以防止使用过多的堆栈空间。默认限制为 12。此限制足以处理 MATCH 运算符右侧最多 4095 个搜索词,并且它将堆栈空间使用量控制在 2000 字节以下。

对于普通的 FTS3/FTS4 查询,搜索树深度大约是 MATCH 运算符右侧术语数量的以 2 为底的对数。但是,对于 短语查询NEAR 查询,搜索树深度与右侧术语的数量成线性关系。因此,默认深度限制 12 足以处理 MATCH 上最多 4095 个普通术语,但它仅足以处理 11 或 12 个短语或 NEAR 术语。即便如此,默认值对于大多数应用程序来说也绰绰有余。

SQLITE_JSON_MAX_DEPTH=N

此宏设置 JSON 对象和数组的最大嵌套深度。默认值为 1000。

JSON SQL 函数 使用 递归下降解析器。这意味着深度嵌套的 JSON 可能需要大量堆栈空间才能进行解析。在堆栈空间有限的系统上,可以将 SQLite 编译为大大降低的最大 JSON 嵌套深度,以避免出现堆栈溢出的可能性,即使来自恶意输入也是如此。即使对于最复杂的真实世界 JSON,10 或 20 的值通常也足够了。

SQLITE_LIKE_DOESNT_MATCH_BLOBS

此编译时选项会导致 LIKE 运算符在任一操作数为 BLOB 时始终返回 False。 LIKE 的默认行为是在进行比较之前将 BLOB 操作数转换为 TEXT。

此编译时选项使 SQLite 在处理使用 LIKE 运算符的查询时运行效率更高,但代价是破坏向后兼容性。但是,向后兼容性的破坏可能仅仅是技术上的。在 LIKE 处理逻辑中存在一个长期存在的错误(请参阅 https://www.sqlite.org/src/info/05f43be8fdda9f),导致它在 BLOB 操作数的情况下出现错误行为,并且在近 10 年的活跃使用中没有人注意到该错误。因此,对于大多数用户来说,启用此编译时选项可能是安全的,从而可以节省 LIKE 查询上的一点 CPU 时间。

此编译时选项仅影响 SQL LIKE 运算符,对 sqlite3_strlike() C 语言接口没有影响。

SQLITE_MAX_MEMORY=N

此选项将 SQLite 从 malloc() 请求的内存总量限制为 N 字节。SQLite 尝试分配新内存的任何操作,如果会导致 SQLite 持有的所有分配的总和超过 N 字节,都将导致内存不足错误。这是一个硬性上限。另请参阅 sqlite3_soft_heap_limit() 接口。

此选项是对分配的内存量的限制。有关单个内存分配允许的内存量的限制,请参阅 SQLITE_MAX_ALLOCATION_SIZE 选项。

此限制仅在可以通过 sqlite3_memory_used()sqlite3_status64(SQLITE_STATUS_MEMORY_USED) 接口获得内存使用统计信息时才有效。如果没有该内存使用信息,SQLite 将无法知道何时即将超出限制,因此无法阻止过多的内存分配。内存使用跟踪默认情况下处于启用状态,但可以通过使用 SQLITE_DEFAULT_MEMSTATUS 选项在编译时禁用,或通过使用 sqlite3_config(SQLITE_CONFIG_MEMSTATUS) 在启动时禁用。

SQLITE_MAX_MMAP_SIZE=N

此宏为任何单个数据库可以使用内存映射 I/O 的地址空间量设置硬性上限。将此值设置为 0 将完全禁用内存映射 I/O,并导致与内存映射 I/O 相关的逻辑从构建中省略。此选项不会更改默认的内存映射 I/O 地址空间大小(由 SQLITE_DEFAULT_MMAP_SIZE 或 sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) 设置)或运行时内存映射 I/O 地址空间大小(由 sqlite3_file_control(SQLITE_FCNTL_MMAP_SIZE) 或 PRAGMA mmap_size 设置),只要这些其他设置小于此处定义的最大值。

SQLITE_MAX_SCHEMA_RETRY=N

每当数据库模式更改时,预准备语句都会自动重新准备以适应新的模式。这里存在一个竞争条件,即如果一个线程不断更改模式,则另一个线程可能会在预准备语句的重新解析和重新准备上循环,并且永远无法完成任何实际工作。此参数通过强制旋转线程在尝试重新编译预准备语句的固定次数后放弃来防止无限循环。默认设置为 50,对于大多数应用程序来说绰绰有余。

SQLITE_MAX_WORKER_THREADS=N

sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,N) 设置设置上限,该设置确定单个 预准备语句 将用于帮助进行 CPU 密集型计算(主要是排序)的辅助线程的最大数量。另请参阅 SQLITE_DEFAULT_WORKER_THREADS 选项。

SQLITE_MEMDB_DEFAULT_MAXSIZE=N

设置使用 sqlite3_deserialize() 创建的内存数据库的默认大小限制(以字节为单位)。这仅仅是默认值。可以使用 sqlite3_config(SQLITE_CONFIG_MEMDB_MAXSIZE,N) 在启动时更改限制,或使用 SQLITE_FCNTL_SIZE_LIMIT 文件控制 在运行时为各个数据库更改限制。如果未指定默认值,则使用 1073741824。

SQLITE_MINIMUM_FILE_DESCRIPTOR=N

unix VFS 永远不会使用小于 N 的文件描述符。N 的默认值为 3。

避免使用编号较低的文件描述符是为了防止意外的数据库损坏。例如,如果数据库文件是使用文件描述符 2 打开的,然后断言失败并调用 write(2,...),则很可能会通过用断言错误消息覆盖数据库文件的一部分来导致数据库损坏。仅使用值较高的文件描述符可以避免此潜在问题。可以通过将此编译时选项设置为 0 来禁用防止使用编号较低的文件描述符的保护。

SQLITE_POWERSAFE_OVERWRITE=<0 或 1>

此选项更改了对 unix 和 windows VFSes 的底层文件系统的 电源安全覆盖 的默认假设。将 SQLITE_POWERSAFE_OVERWRITE 设置为 1 会导致 SQLite 假设应用程序级写入不能更改写入字节范围之外的字节,即使写入发生在电源丢失之前。当 SQLITE_POWERSAFE_OVERWRITE 设置为 0 时,SQLite 假设与已写入字节位于同一扇区的其他字节可能会因电源丢失而更改或损坏。

SQLITE_PRINTF_PRECISION_LIMIT=N

此选项限制 printf() SQL 函数 和其他 C 语言字符串格式化函数(如 sqlite3_mprintf()sqlite3_str_appendf())的替换的最大宽度和精度。这反过来可以防止恶意或故障脚本通过调用以下格式来使用过多的内存:printf('%*s',2147483647,'hi')"。N 的值大约为 100000 通常就足够了。

printf() SQL 函数sqlite3_limit()SQLITE_LIMIT_LENGTH 限制。因此,宽度或精度超过 SQLITE_LIMIT_LENGTH 的任何 printf() 结果都将导致 SQLITE_TOOBIG 错误。但是,printf() 函数的底层格式化是由一个子例程完成的,该子例程无法访问 SQLITE_LIMIT_LENGTH。因此,底层格式化完成到可能远大于 SQLITE_LIMIT_LENGTH 的内存分配中,并且仅在所有格式化完成后才执行 SQLITE_LIMIT_LENGTH 检查。因此,可能会存在一个超出 SQLITE_LIMIT_LENGTH 的瞬态缓冲区。SQLITE_PRINTF_PRECISION_LIMIT 选项是另一项检查,它可以防止在底层格式化子例程内部使用过大的瞬态缓冲区大小,这在 SQLITE_LIMIT_LENGTH 检查之前。

注意不要将 SQLITE_PRINTF_PRECISION_LIMIT 设置得太低。SQLite 使用其 内置 printf() 功能来格式化存储在 sqlite_schema 表 中的 CREATE 语句的文本。因此,SQLITE_PRINTF_PRECISION_LIMIT 至少应与您可能遇到的最大表、索引、视图或触发器定义一样大。

如果宽度或精度超过 SQLITE_PRINTF_PRECISION_LIMIT,则不会引发错误。而是会静默截断较大的宽度或精度。

SQLITE_PRINTF_PRECISION_LIMIT 的默认值为 2147483647 (0x7fffffff)。

SQLITE_QUERY_PLANNER_LIMIT=N

作为查询计划过程的一部分,SQLite 枚举索引和 WHERE 子句约束的所有可用组合。对于某些病态查询,这些索引和约束组合的数量可能非常大,从而导致查询计划程序的性能下降。SQLITE_QUERY_PLANNER_LIMIT 值(与相关的 SQLITE_QUERY_PLANNER_LIMIT_INCR 设置一起)限制了查询计划程序将考虑的索引和约束组合的数量,以防止查询计划程序使用过多的 CPU 时间。SQLITE_QUERY_PLANNER_LIMIT 的默认值设置得足够高,因此在现实世界的查询中永远不会达到。查询计划程序搜索限制仅适用于专门设计为使用过多的计划时间的查询。

SQLITE_QUERY_PLANNER_LIMIT_INCR=N

SQLITE_QUERY_PLANNER_LIMIT 选项为查询计划程序考虑的索引和约束组合的最大数量设置初始基线值。在处理联接的每个表之前,基线查询计划程序限制将增加 SQLITE_QUERY_PLANNER_LIMIT_INCR,以便保证每个表都能够向优化器提出至少一些索引和约束组合,即使联接的先前表已用尽基线限制。此编译时选项和 SQLITE_QUERY_PLANNER_LIMIT 选项的默认值都设置得足够高,因此在现实世界的查询中应该永远不会达到。

SQLITE_REVERSE_UNORDERED_SELECTS

此选项导致 PRAGMA reverse_unordered_selects 设置默认启用。启用后,缺少 ORDER BY 子句的 SELECT 语句将以相反的顺序运行。

此选项可用于检测应用程序何时(错误地)假设没有 ORDER BY 子句的 SELECT 中行的顺序始终相同。

SQLITE_SORTER_PMASZ=N

如果通过 PRAGMA threads 设置启用了多线程处理,则当要排序的内容量超过由 cache_size 和由 SQLITE_CONFIG_PMASZ 启动时选项确定的 PMA 大小的最小值时,排序操作将尝试启动辅助线程。此编译时选项为 SQLITE_CONFIG_PMASZ 启动时选项设置默认值。默认值为 250。

SQLITE_STMTJRNL_SPILL=N

SQLITE_STMTJRNL_SPILL 编译时选项确定 SQLITE_CONFIG_STMTJRNL_SPILL 启动时设置的默认设置。该设置确定 语句日志 从内存移动到磁盘的大小阈值。

SQLITE_WIN32_MALLOC

此选项启用使用 Windows 堆 API 函数进行内存分配,而不是使用标准库 malloc() 和 free() 例程。

YYSTACKDEPTH=<最大深度>

此宏设置 SQLite 中 SQL 解析器使用的 LALR(1) 堆栈的最大深度。默认值为 100。典型的应用程序将使用不到 20 个堆栈级别。其应用程序包含需要超过 100 个 LALR(1) 堆栈条目的 SQL 语句的开发人员应该认真考虑重构其 SQL,因为它很可能超出了任何人类理解的能力。

5. 设置大小限制的选项

有一些编译时选项将设置 SQLite 中各种结构的大小上限。编译时选项通常设置一个硬性上限,可以使用 sqlite3_limit() 接口在运行时为各个 数据库连接 更改该上限。

设置上限的编译时选项 在单独的文档中进行了说明。以下是可用设置的列表

也有一些大小限制无法使用 sqlite3_limit() 进行修改。例如,请参阅

6. 控制操作特性的选项

SQLITE_4_BYTE_ALIGNED_MALLOC

在大多数系统上,malloc() 系统调用返回的对齐到 8 字节边界的缓冲区。但在某些系统(例如:windows)上,malloc() 返回 4 字节对齐的指针。此编译时选项必须在从 malloc() 返回 4 字节对齐指针的系统上使用。

SQLITE_CASE_SENSITIVE_LIKE

如果存在此选项,则内置的 LIKE 运算符将区分大小写。可以使用 case_sensitive_like pragma 在运行时实现相同的效果。

SQLITE_DIRECT_OVERFLOW_READ

当存在此选项时,数据库文件溢出页中包含的内容在读取事务期间直接从磁盘读取,绕过 页面缓存。在大量读取大型 BLOB 或字符串的应用程序中,此选项可以提高读取性能。

从 3.45.0 版本(2024-01-15)开始,此选项默认启用。要禁用它,请使用 -DSQLITE_DIRECT_OVERFLOW_READ=0。

SQLITE_HAVE_ISNAN

如果存在此选项,则 SQLite 将使用系统数学库中的 isnan() 函数。这是 HAVE_ISNAN 配置选项的别名。

SQLITE_MAX_ALLOCATION_SIZE=N

此编译时选项设置可以使用 sqlite3_malloc64()sqlite3_realloc64() 等请求的内存分配大小的上限。默认值为 2,147,483,391 (0x7ffffeff),这应被视为上限。大多数应用程序可以使用几百万字节的最大分配大小。

这是任何单个内存分配的最大大小的限制。它 *不是* 已分配总内存量的限制。有关已分配总内存量的限制,请参阅 SQLITE_MAX_MEMORY

减少单个内存分配的最大大小可以提供额外的防御措施,以防止尝试通过执行许多大型分配来耗尽系统内存的拒绝服务攻击。它也是针对应用程序错误的额外防御层,其中内存分配的大小使用可能溢出的带符号 32 位整数计算 → 使用较小的最大分配大小,此类有错误的内存分配大小计算很可能由于内存不足错误而更快地被发现,并且在整数实际溢出之前。

SQLITE_OS_OTHER=<0 或 1>

该选项导致 SQLite 忽略其针对 Unix、Windows 和 OS/2 的内置操作系统接口。生成的库将没有默认的 操作系统接口。应用程序必须使用 sqlite3_vfs_register() 注册适当的接口才能使用 SQLite。应用程序还必须为 sqlite3_os_init()sqlite3_os_end() 接口提供实现。通常的做法是为提供的 sqlite3_os_init() 调用 sqlite3_vfs_register()。SQLite 在初始化时将自动调用 sqlite3_os_init()

此选项通常用于为具有自定义操作系统的嵌入式平台构建 SQLite 时。

SQLITE_SECURE_DELETE

此编译时选项更改 secure_delete pragma 的默认设置。当不使用此选项时,secure_delete 默认关闭。当存在此选项时,secure_delete 默认打开。

secure_delete 设置导致已删除的内容被零覆盖。由于必须发生额外的 I/O,因此性能会略有下降。另一方面,secure_delete 可以防止敏感信息片段在数据库文件被删除后残留在未使用部分中。有关更多信息,请参阅 secure_delete pragma 上的文档。

SQLITE_THREADSAFE=<0 或 1 或 2>

此选项控制是否在 SQLite 中包含代码以使其能够在多线程环境中安全运行。默认为 SQLITE_THREADSAFE=1,这在多线程环境中安全使用。当使用 SQLITE_THREADSAFE=0 编译时,所有互斥代码都被省略,并且在多线程程序中使用 SQLite 是不安全的。当使用 SQLITE_THREADSAFE=2 编译时,只要没有两个线程尝试同时使用相同的 数据库连接(或从该数据库连接派生的任何 预处理语句),就可以在多线程程序中使用 SQLite。

换句话说,SQLITE_THREADSAFE=1 将默认的 线程模式 设置为 Serialized。SQLITE_THREADSAFE=2 将默认的 线程模式 设置为 Multi-threaded。SQLITE_THREADSAFE=0 将 线程模式 设置为 Single-threaded。

可以使用 sqlite3_threadsafe() 接口在运行时确定 SQLITE_THREADSAFE 的值。

当 SQLite 已使用 SQLITE_THREADSAFE=1 或 SQLITE_THREADSAFE=2 编译时,可以使用 sqlite3_config() 接口以及以下其中一个动词在运行时更改 线程模式

SQLITE_OPEN_NOMUTEXSQLITE_OPEN_FULLMUTEX 标志到 sqlite3_open_v2() 也可用于在运行时调整各个 数据库连接线程模式

请注意,当 SQLite 使用 SQLITE_THREADSAFE=0 编译时,使 SQLite 线程安全的代码将从构建中省略。发生这种情况时,无法在启动时或运行时更改 线程模式

有关在多线程环境中使用 SQLite 的各个方面的更多信息,请参阅 线程模式 文档。

SQLITE_TEMP_STORE=<0 到 3>

此选项控制临时文件是存储在磁盘上还是存储在内存中。此编译时选项的各种设置的含义如下

SQLITE_TEMP_STORE含义
0始终使用临时文件
1默认使用文件,但允许 PRAGMA temp_store 命令覆盖
2默认使用内存,但允许 PRAGMA temp_store 命令覆盖
3始终使用内存

默认设置为 1。更多信息可以在 tempfiles.html 中找到。

SQLITE_TRACE_SIZE_LIMIT=N

如果此宏定义为正整数 N,则扩展到 sqlite3_trace() 输出中的参数的字符串和 BLOB 的长度限制为 N 字节。

SQLITE_TRUSTED_SCHEMA=<0 或 1>

此宏确定 SQLITE_DBCONFIG_TRUSTED_SCHEMAPRAGMA trusted_schema 设置的默认值。如果未指定其他设置,则出于向后兼容性考虑,trusted-schema 设置默认为 ON(值为 1)。但是,为了获得最佳安全性,实现 应用程序定义的 SQL 函数 和/或 虚拟表 的系统应考虑将其默认值更改为 OFF。

SQLITE_USE_URI

此选项导致 URI 文件名 处理逻辑默认启用。

7. 启用通常关闭的功能的选项

SQLITE_ALLOW_URI_AUTHORITY

URI 文件名 通常会在 authority 部分为空或为“localhost”以外的值时引发错误。但是,如果 SQLite 使用 SQLITE_ALLOW_URI_AUTHORITY 编译时选项编译,则 URI 将转换为统一命名约定 (UNC) 文件名,并以这种方式传递给底层操作系统。

SQLite 的一些未来版本可能会更改为默认启用此功能。

SQLITE_ALLOW_COVERING_INDEX_SCAN=<0 或 1>

此 C 预处理器宏确定 SQLITE_CONFIG_COVERING_INDEX_SCAN 配置设置的默认设置。它默认为 1(开启),这意味着覆盖索引在可能的情况下用于完整表扫描,以减少 I/O 并提高性能。但是,将覆盖索引用于完整扫描会导致结果以与传统不同的顺序出现,这可能会导致某些(编码错误的)传统应用程序中断。因此,可以在希望最大程度减少暴露传统应用程序中错误的风险的系统上在编译时禁用覆盖索引扫描选项。

SQLITE_ENABLE_8_3_NAMES=<1 或 2>

如果定义了此 C 预处理器宏,则会包含额外的代码,使 SQLite 能够在仅支持 8+3 文件名的文件系统上运行。如果此宏的值为 1,则默认行为是继续使用长文件名,并且仅在使用 URI 文件名 并带有“8_3_names=1”查询参数打开数据库连接时才使用 8+3 文件名。如果此宏的值为 2,则使用 8+3 文件名成为默认设置,但可以使用8_3_names=0查询参数禁用。

SQLITE_ENABLE_API_ARMOR

定义时,此 C 预处理器宏会激活额外的代码,这些代码尝试检测 SQLite API 的误用,例如将 NULL 指针传递给必需的参数或在对象被销毁后使用对象。启用此选项并检测到非法 API 使用时,接口通常会返回 SQLITE_MISUSE。

SQLITE_ENABLE_API_ARMOR 选项不能保证检测到所有非法 API 使用。即使启用了 SQLITE_ENABLE_API_ARMOR,将不正确的值传递到 C 语言 API 也可能导致进程由于分段错误或空指针取消引用或其他原因而崩溃。SQLITE_ENABLE_API_ARMOR 编译时选项旨在作为应用程序测试和调试选项的辅助工具。应用程序不应依赖 SQLITE_ENABLE_API_ARMOR 来确保安全。SQLITE_ENABLE_API_ARMOR 作为针对应用程序错误的第二道防线是合适的,但它不应是唯一的防线。如果任何 SQLite 接口返回 SQLITE_MISUSE,则表示应用程序正在违反规范使用 SQLite,并且应用程序包含错误。SQLITE_MISUSE 返回值使应用程序有机会优雅地响应该错误,而不是简单地使进程崩溃或调用未定义的行为,仅此而已。应用程序不应利用或依赖 SQLITE_MISUSE 进行常规处理。

SQLITE_ENABLE_ATOMIC_WRITE

如果定义了此 C 预处理器宏,并且如果数据库文件的 sqlite3_io_methods 对象的 xDeviceCharacteristics 方法(通过 SQLITE_IOCAP_ATOMIC 位之一)报告文件系统支持原子写入,并且如果事务仅涉及对数据库文件的单个页面的更改,则事务仅使用数据库的单个页面的单个写入请求提交,并且不会创建或写入回滚日志。在支持原子写入的文件系统上,这种优化可以显着提高小型更新的速度。但是,很少有文件系统支持此功能,并且检查此功能的代码路径会降低缺乏原子写入功能的系统上的写入性能,因此此功能默认禁用。

SQLITE_ENABLE_BATCH_ATOMIC_WRITE

此编译时选项使 SQLite 能够利用底层文件系统中的批量原子写入功能。从 SQLite 3.21.0 版本(2017-10-24)开始,这仅在 F2FS 上受支持。但是,该接口是使用 sqlite3_file_control() 以及 SQLITE_FCNTL_BEGIN_ATOMIC_WRITESQLITE_FCNTL_COMMIT_ATOMIC_WRITE 通用实现的,因此将来可以将其功能添加到其他文件系统时间中。启用此选项后,SQLite 会自动检测底层文件系统是否支持批量原子写入,如果支持,则会避免为事务控制写入 回滚日志。这可以使事务速度提高两倍以上,同时减少对 SSD 存储设备的磨损。

SQLite 的未来版本可能会默认启用批量原子写入功能,届时此编译时选项将变得多余。

SQLITE_ENABLE_BYTECODE_VTAB

此选项启用字节码和 tables_used 虚拟表

SQLITE_ENABLE_COLUMN_METADATA

当定义此 C 预处理器宏时,SQLite 会包含一些额外的 API,这些 API 提供了对表和查询元数据的便捷访问。此选项启用的 API 为

SQLITE_ENABLE_DBPAGE_VTAB

此选项启用SQLITE_DBPAGE 虚拟表

SQLITE_ENABLE_DBSTAT_VTAB

此选项启用dbstat 虚拟表

SQLITE_ENABLE_DESERIALIZE

此选项以前用于启用sqlite3_serialize()sqlite3_deserialize() 接口。但是,从 SQLite 3.36.0(2021-06-18)开始,这些接口默认启用,并添加了一个新的编译时选项SQLITE_OMIT_DESERIALIZE 来省略它们。

SQLITE_ENABLE_EXPLAIN_COMMENTS

此选项向 SQLite 添加额外的逻辑,该逻辑将注释文本插入到EXPLAIN 的输出中。这些额外的注释使用额外的内存,从而使预处理语句更大且速度略有下降,因此默认情况下以及在大多数应用程序中将其关闭。但是,某些应用程序(例如 SQLite 的命令行 shell)更重视 EXPLAIN 输出的清晰度而不是原始性能,因此此编译时选项可供它们使用。如果启用了SQLITE_DEBUG,则也会自动启用 SQLITE_ENABLE_EXPLAIN_COMMENTS 编译时选项。

SQLITE_ENABLE_FTS3

当在合并文件中定义此选项时,版本 3 和 4 的全文搜索引擎会自动添加到构建中。

SQLITE_ENABLE_FTS3_PARENTHESIS

此选项修改 FTS3 中的查询模式解析器,使其支持 AND 和 NOT 运算符(除了通常的 OR 和 NEAR 之外),还允许查询表达式包含嵌套括号。

SQLITE_ENABLE_FTS3_TOKENIZER

此选项启用fts3_tokenizer() 接口的两个参数版本。fts3_tokenizer() 的第二个参数应该是一个指向函数的指针(编码为 BLOB),该函数实现应用程序定义的标记器。如果恶意行为者能够使用任意第二个参数运行 fts3_tokenizer() 的两个参数版本,他们可能会利用它导致崩溃或控制进程。

由于安全问题,从版本 3.11.0(2016-02-15)开始,除非使用此编译时选项,否则禁用两个参数的 fts3_tokenizer() 功能。版本 3.12.0(2016-03-29)添加了sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0) 接口,该接口在运行时为特定的数据库连接激活fts3_tokenizer() 的两个参数版本。

SQLITE_ENABLE_FTS4

当在合并文件中定义此选项时,版本 3 和 4 的全文搜索引擎会自动添加到构建中。

SQLITE_ENABLE_FTS5

当在合并文件中定义此选项时,版本 5 的全文搜索引擎(fts5)会自动添加到构建中。

SQLITE_ENABLE_GEOPOLY

当在合并文件中定义此选项时,Geopoly 扩展 将包含在构建中。

SQLITE_ENABLE_HIDDEN_COLUMNS

当在合并文件中定义此选项时,将为虚拟表启用隐藏列 功能。

SQLITE_ENABLE_ICU

此选项会导致将Unicode 国际组件 或“ICU”扩展添加到 SQLite 的构建中。

SQLITE_ENABLE_IOTRACE

当 SQLite 核心和命令行界面(CLI)都使用此选项进行编译时,CLI 将提供一个名为“.iotrace”的额外命令,该命令提供 I/O 活动的低级日志。此选项为实验性选项,可能会在将来的版本中停止使用。

SQLITE_ENABLE_MATH_FUNCTIONS

此宏启用内置 SQL 数学函数。在 Unix 平台上,除非使用 --disable-math 选项,否则配置脚本会自动将此选项添加到 Makefile 中。此选项也包含在使用“Makefile.msc”makefile 为 nmake 构建的 Windows 版本中。

SQLITE_ENABLE_JSON1

此编译时选项是无操作的。在 SQLite 3.38.0(2022-02-22)版本之前,需要使用此选项进行编译才能在构建中包含JSON SQL 函数。但是,从 SQLite 3.38.0 版本开始,这些函数默认包含在内。使用-DSQLITE_OMIT_JSON 选项来省略它们。

SQLITE_ENABLE_LOCKING_STYLE

此选项在 Mac OS X 的 OS 接口层中启用其他逻辑。其他逻辑尝试确定底层文件系统的类型,并选择适用于该文件系统类型的替代锁定策略。五种锁定策略可用

此外,还提供了五个额外的VFS 实现以及默认实现。通过在调用sqlite3_open_v2() 时指定其中一个额外的 VFS 实现,应用程序可以绕过文件系统检测逻辑并显式选择上述锁定样式之一。五个额外的VFS 实现分别称为“unix-posix”、“unix-afp”、“unix-flock”、“unix-dotfile”和“unix-none”。

SQLITE_ENABLE_MEMORY_MANAGEMENT

此选项向 SQLite 添加额外的逻辑,使其能够根据请求释放未使用的内存。必须启用此选项才能使sqlite3_release_memory() 接口正常工作。如果不使用此编译时选项,则sqlite3_release_memory() 接口将成为无操作。

SQLITE_ENABLE_MEMSYS3

此选项包含 SQLite 中的代码,该代码实现了备用内存分配器。仅当sqlite3_config()SQLITE_CONFIG_HEAP 选项用于提供一个大块内存(所有内存分配都来自该内存)时,才会使用此备用内存分配器。MEMSYS3 内存分配器使用一种混合分配算法,该算法以 dlmalloc() 为蓝本。一次只能启用 SQLITE_ENABLE_MEMSYS3 或 SQLITE_ENABLE_MEMSYS5 中的一个。

SQLITE_ENABLE_MEMSYS5

此选项包含 SQLite 中的代码,该代码实现了备用内存分配器。仅当sqlite3_config()SQLITE_CONFIG_HEAP 选项用于提供一个大块内存(所有内存分配都来自该内存)时,才会使用此备用内存分配器。MEMSYS5 模块将所有分配四舍五入到下一个 2 的幂,并使用一种首次适配、伙伴分配算法,该算法在某些操作约束下提供了针对碎片和崩溃的强有力保证。

SQLITE_ENABLE_NORMALIZE

此选项包含sqlite3_normalized_sql() API。

SQLITE_ENABLE_NULL_TRIM

此选项启用一项优化,该优化会省略行末尾的 NULL 列,从而节省磁盘空间。

使用此选项启用的数据库无法被 SQLite 3.1.6(2005-03-17)及更早版本读取。此外,使用此选项启用的数据库容易触发e6e962d6b0f06f46 错误sqlite3_blob_reopen() 接口。由于这些原因,此优化默认处于禁用状态。但是,此优化可能会在 SQLite 的未来版本中默认启用。

SQLITE_ENABLE_OFFSET_SQL_FUNC

此选项启用对sqlite_offset(X) SQL 函数的支持。

sqlite_offset(X) SQL 函数需要 B 树存储引擎上的新接口、运行 SQL 语句的虚拟机中的新操作码以及代码生成器关键路径中的新条件。为了避免在不需要 sqlite_offset(X) 实用程序的应用程序中出现此开销,该函数默认处于禁用状态。

SQLITE_ENABLE_PREUPDATE_HOOK

此选项启用几个新的 API,这些 API 在对rowid 表进行任何更改之前提供回调。回调可用于记录更改发生之前行的状态。

预更新挂钩的操作类似于更新挂钩,不同之处在于回调是在更改之前调用的,而不是之后调用的,并且除非使用此编译时选项,否则会省略预更新挂钩接口。

最初添加预更新挂钩接口是为了支持session 扩展。

SQLITE_ENABLE_QPSG

此选项会导致查询计划程序稳定性保证(QPSG)默认开启。通常情况下,QPSG 是关闭的,必须使用sqlite3_db_config() 接口的SQLITE_DBCONFIG_ENABLE_QPSG 选项在运行时激活它。

SQLITE_ENABLE_RBU

启用实现RBU 扩展的代码。

SQLITE_ENABLE_RTREE

此选项会导致 SQLite 包含对R*Tree 索引扩展的支持。

SQLITE_ENABLE_SESSION

此选项启用session 扩展

SQLITE_ENABLE_SNAPSHOT

此选项启用代码以支持sqlite3_snapshot 对象及其相关接口

SQLITE_ENABLE_SORTER_REFERENCES

此选项激活一项优化,该优化减少了排序程序所需的内存,但代价是在排序完成后执行其他 B 树查找。

默认的排序过程是收集最终将输出的所有信息到“记录”中,并将该完整记录传递给排序程序。但在某些情况下,例如,如果某些输出列包含大型 BLOB 值,则每个记录的大小可能会很大,这意味着排序程序要么必须使用更多内存,要么将更多内容写入临时存储。

启用 SQLITE_ENABLE_SORTER_REFERENCES 后,传递给排序程序的记录通常仅包含ROWID 值。此类记录要小得多。这意味着排序程序处理的“有效负载”少得多,并且可以运行得更快。排序完成后,ROWID 用于在原始表中查找输出列值。这需要对表进行另一次搜索,并且可能会导致速度变慢。或者,这可能是一种性能提升,具体取决于值的大小。

即使启用了 SQLITE_ENABLE_SORTER_REFERENCES 编译时选项,排序程序引用也仍处于默认禁用状态。要使用排序程序引用,应用程序必须在启动时使用sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE) 接口设置排序程序引用大小阈值。

由于 SQLite 开发人员尚不清楚 SQLITE_ENABLE_SORTER_REFERENCES 选项是否会提升或降低性能,因此目前(2018-05-04)默认情况下禁用该选项。根据未来对它对性能影响的了解,它可能会在某个将来的版本中默认启用。

SQLITE_ENABLE_STMT_SCANSTATUS

此选项启用 sqlite3_stmt_scanstatus()sqlite3_stmt_scanstatus_v2() 接口。这些接口通常从构建中省略,因为即使在不使用该功能的语句上,它们也会造成性能损失。

SQLITE_ENABLE_STMTVTAB

此编译时选项启用 SQLITE_STMT 虚拟表 逻辑。

SQLITE_RTREE_INT_ONLY

此编译时选项已弃用且未经测试。

SQLITE_ENABLE_SQLLOG

此选项启用额外的代码(尤其是 SQLITE_CONFIG_SQLLOG 选项到 sqlite3_config()),这些代码可用于创建应用程序执行的所有 SQLite 处理的日志。这些日志可用于对应用程序的行为进行脱机分析,尤其适用于性能分析。为了使 SQLITE_ENABLE_SQLLOG 选项有用,需要一些额外的代码。SQLite 源代码树中的 "test_sqllog.c" 源代码文件是所需额外代码的工作示例。在 unix 和 windows 系统上,开发人员可以将 "test_sqllog.c" 源代码文件的文本附加到 "sqlite3.c" 合并文件的末尾,使用 -DSQLITE_ENABLE_SQLLOG 选项重新编译应用程序,然后使用环境变量控制日志记录。有关更多详细信息,请参阅 "test_sqllog.c" 源代码文件上的标题注释。

SQLITE_ENABLE_STAT2

此选项过去会导致 ANALYZE 命令在 sqlite_stat2 表中收集索引直方图数据。但此功能已被 SQLITE_ENABLE_STAT3 取代,自 SQLite 版本 3.7.9(2011-11-01)起。SQLITE_ENABLE_STAT2 编译时选项现在已成为无操作。

SQLITE_ENABLE_STAT3

此选项过去会导致 ANALYZE 命令在 sqlite_stat3 表中收集索引直方图数据。但此功能已被 SQLITE_ENABLE_STAT4 取代,自 SQLite 版本 3.8.1(2013-10-17)起。SQLITE_ENABLE_STAT3 编译时选项继续得到支持,直到 版本 3.29.0(2019-07-10),但现在已成为无操作。

SQLITE_ENABLE_STAT4

此选项向 ANALYZE 命令和 查询规划器 添加了其他逻辑,这些逻辑可以在某些情况下帮助 SQLite 选择更好的查询计划。增强了 ANALYZE 命令,以从每个索引的所有列收集直方图数据,并将这些数据存储在 sqlite_stat4 表中。然后,查询规划器将使用直方图数据来帮助它做出更好的索引选择。此编译时选项的缺点是它违反了 查询规划器稳定性保证,这使得在批量生产的应用程序中更难以确保一致的性能。

SQLITE_ENABLE_STAT4 是 SQLITE_ENABLE_STAT3 的增强版。STAT3 仅记录每个索引最左侧列的直方图数据,而 STAT4 增强功能则记录每个索引所有列的直方图数据。SQLITE_ENABLE_STAT3 编译时选项已成为无操作。

SQLITE_ENABLE_TREE_EXPLAIN

此编译时选项不再使用。

SQLITE_ENABLE_UPDATE_DELETE_LIMIT

此选项在 UPDATEDELETE 语句上启用可选的 ORDER BY 和 LIMIT 子句。

如果定义了此选项,则在使用 Lemon 解析器生成器 工具生成 parse.c 文件时,也必须定义此选项。因此,此选项仅可在从源代码构建库时使用,不能从 合并文件 或网站上为非类 Unix 平台提供的预打包 C 文件集合中使用。

SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION

当激活 SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 编译时选项时,SQLite 在运行 EXPLAINEXPLAIN QUERY PLAN 时将抑制“未知函数”错误。SQLite 不会引发错误,而是插入一个名为“unknown()”的替代无操作函数。仅在 EXPLAINEXPLAIN QUERY PLAN 上(而不是在普通语句上)将“unknown()”替换为无法识别的函数。

命令行 shell 中使用时,SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION 功能允许将包含应用程序定义函数的 SQL 文本粘贴到 shell 中进行分析和调试,而无需创建和加载实现应用程序定义函数的扩展。

SQLITE_ENABLE_UNLOCK_NOTIFY

此选项启用 sqlite3_unlock_notify() 接口及其关联的功能。有关更多信息,请参阅标题为 使用 SQLite 解锁通知功能 的文档。

SQLITE_INTROSPECTION_PRAGMAS

此选项已过时。它过去曾启用一些额外的 PRAGMA 语句,例如 PRAGMA function_listPRAGMA module_listPRAGMA pragma_list,但这些 pragma 现在都已默认启用。请参阅 SQLITE_OMIT_INTROSPECTION_PRAGMAS

SQLITE_SOUNDEX

此选项启用 soundex() SQL 函数

SQLITE_STRICT_SUBTYPE=1

此选项会导致 应用程序定义的 SQL 函数 引发 SQL 错误,如果它们调用 sqlite3_result_subtype() 接口,但未注册 SQLITE_RESULT_SUBTYPE 属性。此推荐选项有助于在开发周期的早期识别应用程序定义的 SQL 函数实现中的问题。

SQLITE_USE_ALLOCA

如果启用了此选项,则在某些合适的情况下将使用 alloca() 内存分配器。这会导致二进制文件略小且速度更快。当然,SQLITE_USE_ALLOCA 编译时选项仅在支持 alloca() 的系统上有效。

SQLITE_USE_FCNTL_TRACE

此选项会导致 SQLite 发出额外的 SQLITE_FCNTL_TRACE 文件控制,以为 VFS 提供补充信息。"vfslog.c" 扩展利用此功能来提供增强版的 VFS 活动日志。

SQLITE_USE_SEH

此选项过去曾是切换开关,用于启用现在由 SQLITE_OMIT_SEH 控制的功能。客户端代码不应使用此定义,因为它由库内部使用。

SQLITE_HAVE_ZLIB

此选项会导致某些扩展链接到 zlib 压缩库

此选项对 SQLite 核心没有影响。它仅由扩展使用。此选项对于 SQL 归档 支持在 命令行 shell 中使用的压缩和解压缩函数是必需的。

使用此选项编译时,通常需要添加链接器选项以将 zlib 库包含在构建中。通常此选项为 "-lz",但在不同的系统上可能有所不同。

在 Windows 系统上使用 MSVC 构建时,可以将 zlib 源代码放在源代码树的 compat/zlib 子目录中,然后将 USE_ZLIB=1 选项添加到 nmake 命令中,以使 Makefile.msc 自动构建并使用适当的 zlib 库实现。

YYTRACKMAXSTACKDEPTH

此选项会导致使用 sqlite3_status(SQLITE_STATUS_PARSER_STACK,...) 接口跟踪和报告 LALR(1) 解析器堆栈深度。SQLite 的 LALR(1) 解析器具有固定的堆栈深度(在编译时使用 YYSTACKDEPTH 选项确定)。此选项可用于帮助确定应用程序是否接近超出最大 LALR(1) 堆栈深度。

8. 禁用通常启用的功能的选项

SQLITE_DISABLE_LFS

如果定义了此 C 预处理器宏,则禁用大文件支持。

SQLITE_DISABLE_DIRSYNC

如果定义了此 C 预处理器宏,则禁用目录同步。SQLite 通常会在删除文件时尝试同步父目录,以确保目录条目立即在磁盘上更新。

SQLITE_DISABLE_FTS3_UNICODE

如果定义了此 C 预处理器宏,则 unicode61 分词器在 FTS3 中将从构建中省略,并且应用程序无法使用。

SQLITE_DISABLE_FTS4_DEFERRED

如果此 C 预处理器宏禁用 FTS4 中的“延迟令牌”优化。“延迟令牌”优化避免加载集合中大多数文档中存在的术语的大量发布列表,而是简单地扫描文档源中的这些令牌。FTS4 应该在有和没有此优化的情况下获得完全相同的答案。

SQLITE_DISABLE_INTRINSIC

此选项禁用使用编译器特定的内置函数,例如 GCC 和 Clang 中的 __builtin_bswap32() 和 __builtin_add_overflow(),或者 MSVC 中的 _byteswap_ulong() 和 _ReadWriteBarrier()。

SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS

此选项禁用 sqlite3_status() SQLITE_STATUS_PAGECACHE_OVERFLOWSQLITE_STATUS_PAGECACHE_SIZE 统计信息的收集。已证明设置此选项可以在高并发多线程应用程序中提高性能。

9. 省略功能的选项

以下选项可用于 减小编译库的大小,方法是省略未使用的功能。这可能仅在嵌入式系统中(其中空间尤其紧张)才有用,因为即使包含所有功能,SQLite 库也相对较小。不要忘记告诉您的编译器优化二进制文件大小!(如果使用 GCC,则为 -Os 选项)。告诉您的编译器优化大小通常对库占用空间的影响远大于使用任何这些编译时选项。您还应验证是否禁用了 调试选项

本节中的宏不需要值。以下编译开关具有相同的效果
-DSQLITE_OMIT_ALTERTABLE
-DSQLITE_OMIT_ALTERTABLE=1
-DSQLITE_OMIT_ALTERTABLE=0

如果定义了任何这些选项,则在使用 Lemon 解析器生成器 工具生成 parse.c 文件以及编译生成 keywordhash.h 文件的 'mkkeywordhash' 工具时,也必须定义相同的 SQLITE_OMIT_* 选项集。因此,这些选项仅可在从规范源代码构建库时使用,不能从 合并文件 中使用。某些 SQLITE_OMIT_* 选项可能在与 合并文件 一起使用时有效或看起来有效。但这不能保证。通常,始终从规范源代码编译以利用 SQLITE_OMIT_* 选项。

重要说明:SQLITE_OMIT_* 选项可能不适用于 合并文件。SQLITE_OMIT_* 编译时选项通常仅在从规范源文件构建 SQLite 时才能正常工作。

可以生成确实适用于预定 SQLITE_OMIT_* 选项集的 SQLite 合并文件的特殊版本。为此,请在规范源代码分发版中复制 Makefile.linux-gcc Makefile 模板。将副本的名称简单地更改为“Makefile”。然后编辑“Makefile”以设置适当的编译时选项。然后输入

make clean; make sqlite3.c

然后,生成的 "sqlite3.c" 合并代码文件(及其关联的头文件 "sqlite3.h")可以移动到非 Unix 平台,使用本机编译器进行最终编译。

SQLITE_OMIT_* 选项不受支持。我们的意思是,在当前版本中从构建中省略代码的 SQLITE_OMIT_* 选项在下一个版本中可能会变成无操作。或者反过来:在当前版本中是无操作的 SQLITE_OMIT_* 可能会导致在下一个版本中排除代码。此外,并非所有 SQLITE_OMIT_* 选项都经过测试。某些 SQLITE_OMIT_* 选项可能会导致 SQLite 出现故障和/或提供错误的答案。

重要说明:SQLITE_OMIT_* 编译时选项大多不受支持。

以下是可用的 OMIT 选项:

SQLITE_OMIT_ALTERTABLE

如果定义了此选项,则库中不包含 ALTER TABLE 命令。执行 ALTER TABLE 语句会导致解析错误。

SQLITE_OMIT_ANALYZE

如果定义了此选项,则 ANALYZE 命令将从构建中省略。

SQLITE_OMIT_ATTACH

如果定义了此选项,则 ATTACHDETACH 命令将从构建中省略。

SQLITE_OMIT_AUTHORIZATION

定义此选项会从库中省略授权回调功能。库中不存在 sqlite3_set_authorizer() API 函数。

SQLITE_OMIT_AUTOINCREMENT

此选项省略了 AUTOINCREMENT 功能。当定义此宏时,声明为 "INTEGER PRIMARY KEY AUTOINCREMENT" 的列的行为与声明为 "INTEGER PRIMARY KEY" 的列相同,当插入 NULL 时。sqlite_sequence 系统表既不会创建,如果它已经存在也不会被尊重。

SQLITE_OMIT_AUTOINIT

为了与缺少 sqlite3_initialize() 接口的旧版 SQLite 版本向后兼容,在进入某些关键接口(如 sqlite3_open()sqlite3_vfs_register()sqlite3_mprintf())时会自动调用 sqlite3_initialize() 接口。通过使用 SQLITE_OMIT_AUTOINIT C 预处理器宏构建 SQLite,可以省略以这种方式自动调用 sqlite3_initialize() 的开销。当使用 SQLITE_OMIT_AUTOINIT 构建时,SQLite 不会自动初始化自身,并且应用程序需要在开始使用 SQLite 库之前直接调用 sqlite3_initialize()

SQLITE_OMIT_AUTOMATIC_INDEX

此选项用于省略 自动索引 功能。另请参阅:SQLITE_DEFAULT_AUTOMATIC_INDEX

SQLITE_OMIT_AUTORESET

默认情况下,sqlite3_step() 接口将自动调用 sqlite3_reset() 以重置 预处理语句(如果必要)。此编译时选项会更改该行为,以便如果在返回除 SQLITE_ROWSQLITE_BUSYSQLITE_LOCKED 之外的任何内容后再次调用 sqlite3_step(),则它将返回 SQLITE_MISUSE,除非在之间调用了 sqlite3_reset()

在 SQLite 3.6.23.1 版本(2010-03-26)及更早版本中,sqlite3_step() 用于在返回除 SQLITE_ROW 之外的任何内容后,如果没有在之间调用 sqlite3_reset(),则始终返回 SQLITE_MISUSE。这在某些编写不佳的智能手机应用程序中造成了问题,这些应用程序没有正确处理 SQLITE_LOCKEDSQLITE_BUSY 错误返回。与其修复许多有缺陷的智能手机应用程序,不如在 3.6.23.2 中更改 SQLite 的行为以自动重置预处理语句。但这项更改在其他实现不正确的应用程序中也造成了问题,这些应用程序实际上是在寻找 SQLITE_MISUSE 返回以终止其查询循环。(每当应用程序从 SQLite 获取 SQLITE_MISUSE 错误代码时,都意味着应用程序正在错误地使用 SQLite 接口,因此实现不正确。)SQLITE_OMIT_AUTORESET 接口已添加到 SQLite 3.7.5 版本(2011-02-01)中,以努力使所有(损坏的)应用程序再次工作,而无需实际修复这些应用程序。

SQLITE_OMIT_AUTOVACUUM

如果定义了此选项,则库无法创建或写入支持 auto_vacuum 的数据库。执行 PRAGMA auto_vacuum 语句不是错误(因为未知的 PRAGMA 会被静默忽略),但不会返回值或修改数据库文件中的自动真空标志。如果使用此选项编译的库打开支持自动真空的数据库,则会自动以只读模式打开它。

SQLITE_OMIT_BETWEEN_OPTIMIZATION

此选项禁用在使用 BETWEEN 运算符的 WHERE 子句项中使用索引。

SQLITE_OMIT_BLOB_LITERAL

如果定义了此选项,则无法使用 X'ABCD' 语法在 SQL 语句中指定 blob。

SQLITE_OMIT_BTREECOUNT

此选项不再用于任何用途。它是一个无操作。

SQLITE_OMIT_BUILTIN_TEST

此编译时选项已重命名为 SQLITE_UNTESTABLE

SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA

此编译时选项禁用 PRAGMA case_sensitive_like 命令。

SQLITE_OMIT_CAST

此选项导致 SQLite 省略对 CAST 运算符的支持。

SQLITE_OMIT_CHECK

此选项导致 SQLite 省略对 CHECK 约束的支持。解析器仍将在 SQL 语句中接受 CHECK 约束,但不会强制执行。

SQLITE_OMIT_COMPILEOPTION_DIAGS

此选项用于省略 SQLite 中可用的编译时选项诊断,包括 sqlite3_compileoption_used()sqlite3_compileoption_get() C/C++ 函数、sqlite_compileoption_used()sqlite_compileoption_get() SQL 函数以及 compile_options pragma

SQLITE_OMIT_COMPLETE

此选项导致省略 sqlite3_complete()sqlite3_complete16() 接口。

SQLITE_OMIT_COMPOUND_SELECT

此选项用于省略复合 SELECT 功能。使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 复合 SELECT 运算符的 SELECT 语句将导致解析错误。

在 VALUES 子句中具有多个值的 INSERT 语句在内部实现为复合 SELECT。因此,此选项还禁用使用 INSERT INTO ... VALUES ... 语句插入多行。

SQLITE_OMIT_CTE

此选项导致省略对 公共表表达式 的支持。

SQLITE_OMIT_DATETIME_FUNCS

如果定义了此选项,则会省略 SQLite 的内置日期和时间操作函数。具体来说,SQL 函数 julianday()、date()、time()、datetime() 和 strftime() 不可用。默认列值 CURRENT_TIME、CURRENT_DATE 和 CURRENT_TIMESTAMP 仍然可用。

SQLITE_OMIT_DECLTYPE

此选项导致 SQLite 省略对 sqlite3_column_decltype()sqlite3_column_decltype16() 接口的支持。

SQLITE_OMIT_DEPRECATED

此选项导致 SQLite 省略对标记为已弃用的接口的支持。这包括 sqlite3_aggregate_count()sqlite3_expired()sqlite3_transfer_bindings()sqlite3_global_recover()sqlite3_thread_cleanup()sqlite3_memory_alarm() 接口以及 PRAGMA 语句 PRAGMA count_changesPRAGMA data_store_directoryPRAGMA default_cache_sizePRAGMA empty_result_callbacksPRAGMA full_column_namesPRAGMA short_column_namesPRAGMA temp_store_directory

SQLITE_OMIT_DESERIALIZE

此选项导致从构建中省略 sqlite3_serialize()sqlite3_deserialize() 接口。

SQLITE_OMIT_DISKIO

此选项省略了所有写入磁盘的支持,并强制数据库仅存在于内存中。此选项尚未维护,可能不适用于较新版本的 SQLite。

SQLITE_OMIT_EXPLAIN

定义此选项会导致从库中省略 EXPLAIN 命令。尝试执行 EXPLAIN 语句将导致解析错误。

SQLITE_OMIT_FLAG_PRAGMAS

此选项省略了查询和设置布尔属性的 PRAGMA 命令的子集的支持。

SQLITE_OMIT_FLOATING_POINT

此选项用于从 SQLite 库中省略浮点数支持。当指定此选项时,将浮点数指定为字面量(即“1.01”)会导致解析错误。

将来,此选项也可能禁用其他浮点功能,例如 sqlite3_result_double()sqlite3_bind_double()sqlite3_value_double()sqlite3_column_double() API 函数。

SQLITE_OMIT_FOREIGN_KEY

如果定义了此选项,则不识别 外键约束 语法。

SQLITE_OMIT_GENERATED_COLUMNS

如果定义了此选项,则不识别 生成列 语法。

SQLITE_OMIT_GET_TABLE

此选项导致省略对 sqlite3_get_table()sqlite3_free_table() 的支持。

SQLITE_OMIT_HEX_INTEGER

此选项省略了对 十六进制整数文字 的支持。

SQLITE_OMIT_INCRBLOB

此选项导致省略对 增量 BLOB I/O 的支持。

SQLITE_OMIT_INTEGRITY_CHECK

此选项省略了对 integrity_check pragma 的支持。

SQLITE_OMIT_INTROSPECTION_PRAGMAS

此选项省略了对 PRAGMA function_listPRAGMA module_listPRAGMA pragma_list 的支持。

SQLITE_OMIT_JSON

此选项从构建中省略了 JSON SQL 函数

SQLITE_OMIT_LIKE_OPTIMIZATION

此选项禁用 SQLite 使用索引来帮助解析 WHERE 子句中的 LIKEGLOB 运算符的功能。

SQLITE_OMIT_LOAD_EXTENSION

此选项从 SQLite 中省略了整个扩展加载机制,包括 sqlite3_enable_load_extension()sqlite3_load_extension() 接口。

SQLITE_OMIT_LOCALTIME

此选项从日期和时间函数中省略了“localtime”修饰符。当尝试在不支持本地时间概念的平台上编译日期和时间函数时,此选项有时很有用。

SQLITE_OMIT_LOOKASIDE

此选项省略了 备用内存分配器

SQLITE_OMIT_MEMORYDB

如果定义了此选项,则库不尊重特殊数据库名称“:memory:”(通常用于创建 内存数据库)。如果将“:memory:”传递给 sqlite3_open()sqlite3_open16()sqlite3_open_v2(),则将打开或创建具有此名称的文件。

SQLITE_OMIT_OR_OPTIMIZATION

此选项禁用 SQLite 将索引与由 OR 运算符连接的 WHERE 子句的项一起使用。

SQLITE_OMIT_PAGER_PRAGMAS

定义此选项会从构建中省略与 pager 子系统相关的 pragma。

SQLITE_OMIT_PRAGMA

此选项用于从库中省略 PRAGMA 命令。请注意,除了此选项之外,定义省略特定 pragma 的宏也很有用,因为它们也可能会删除其他子系统中的支持代码。此宏仅删除 PRAGMA 命令。

SQLITE_OMIT_PROGRESS_CALLBACK

可以定义此选项以省略在长时间运行的 SQL 语句期间发出“进度”回调的功能。库中不存在 sqlite3_progress_handler() API 函数。

SQLITE_OMIT_QUICKBALANCE

此选项省略了一种替代的、更快的 B 树平衡例程。使用此选项使 SQLite 的体积略微减小,但代价是运行速度略微降低。

SQLITE_OMIT_REINDEX

定义此选项后,库中将不包含 REINDEX 命令。执行 REINDEX 语句会导致解析错误。

SQLITE_OMIT_SCHEMA_PRAGMAS

定义此选项会从构建中省略用于查询数据库模式的 pragma。

SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS

定义此选项会从构建中省略用于查询和修改数据库模式版本和用户版本的 pragma。具体来说,schema_versionuser_version PRAGMAs 将被省略。

SQLITE_OMIT_SHARED_CACHE

此选项构建 SQLite 时不包含对 共享缓存模式 的支持。sqlite3_enable_shared_cache() 与 B 树子系统中与共享缓存管理相关的相当一部分逻辑一起被省略。

此编译时选项建议大多数应用程序使用,因为它可以提高性能并减少库占用空间。

SQLITE_OMIT_SEH

如果定义,则在 Windows 构建中禁用结构化异常处理 (SEH)。SEH 是一种 Windows 特定的技术,用于捕获在访问内存映射文件时引发的异常。SEH 用于拦截在访问内存映射的 shm 文件(它是 WAL 模式 处理的一部分)时可能发生的错误。如果操作系统在 SQLite 尝试访问 shm 文件时引发错误,此选项会导致 SQLite 捕获并处理这些错误,而不是中止整个进程。

除了在 Windows 上使用 MSVC 编译时之外,此选项没有任何效果。

SQLITE_OMIT_SUBQUERY

如果定义,则省略对子查询和 IN() 运算符的支持。

SQLITE_OMIT_TCL_VARIABLE

如果定义此宏,则省略用于将 SQL 变量自动绑定到 TCL 变量的特殊 "$" 语法。

SQLITE_OMIT_TEMPDB

此选项省略对 TEMP 或 TEMPORARY 表的支持。

SQLITE_OMIT_TRACE

此选项省略对 sqlite3_profile()sqlite3_trace() 接口及其相关逻辑的支持。

SQLITE_OMIT_TRIGGER

定义此选项会省略对 TRIGGER 对象的支持。在这种情况下,CREATE TRIGGERDROP TRIGGER 命令均不可用,并且尝试执行任何一个命令都会导致解析错误。此选项还会禁用 外键约束 的强制执行,因为实现触发器的代码(此选项省略了该代码)也用于实现 外键操作

SQLITE_OMIT_TRUNCATE_OPTIMIZATION

在 SQLite 的默认构建中,如果 DELETE 语句没有 WHERE 子句并且操作的对象表没有触发器,则会发生优化,导致 DELETE 通过删除并重新创建表来执行。删除并重新创建表通常比逐行删除表内容快得多。这是“截断优化”。

SQLITE_OMIT_UTF16

此宏用于省略对 UTF16 文本编码的支持。定义此宏后,所有返回或接受 UTF16 编码文本的 API 函数都不可用。这些函数可以通过它们以 '16' 结尾这一事实来识别,例如 sqlite3_prepare16()sqlite3_column_text16()sqlite3_bind_text16()

SQLITE_OMIT_VACUUM

定义此选项后,库中将不包含 VACUUM 命令。执行 VACUUM 语句会导致解析错误。

SQLITE_OMIT_VIEW

定义此选项会省略对 VIEW 对象的支持。在这种情况下,CREATE VIEWDROP VIEW 命令均不可用,并且尝试执行任何一个命令都会导致解析错误。

警告:如果定义此宏,则无法打开模式包含 VIEW 对象的数据库。

SQLITE_OMIT_VIRTUALTABLE

此选项省略对 SQLite 中 虚拟表 机制的支持。

SQLITE_OMIT_WAL

此选项省略“预写日志”(也称为“WAL”)功能。

SQLITE_OMIT_WINDOWFUNC

此选项从构建中省略 窗口函数

SQLITE_OMIT_WSD

此选项构建 SQLite 库的版本,该版本不包含任何可写静态数据 (WSD)。WSD 是全局变量和/或静态变量。某些平台不支持 WSD,并且此选项对于 SQLite 在这些平台上工作是必要的。

与其他 OMIT 选项(使 SQLite 库更小)不同,此选项实际上会增加 SQLite 的大小并使其运行速度稍慢。仅当为不支持 WSD 的嵌入式目标构建 SQLite 时,才使用此选项。

SQLITE_OMIT_XFER_OPT

此选项省略对帮助表单“INSERT INTO ... SELECT ...”的语句运行更快的优化的支持。

SQLITE_UNTESTABLE

标准 SQLite 构建包含少量与 sqlite3_test_control() 相关的逻辑,以练习 SQLite 内核的其他难以验证的部分。此编译时选项会省略额外的测试逻辑。在 SQLite 3.16.0(2017-01-02)之前的版本中,此编译时选项称为“SQLITE_OMIT_BUILTIN_TEST”。名称已更改,以更好地描述使用它的含义。

设置此编译时选项会阻止 SQLite 能够完全测试。分支测试覆盖率从 100% 降至约 95%。

SQLite 开发人员遵循 NASA 的“飞行即测试,测试即飞行”原则。如果为交付启用此选项,但在测试时禁用此选项,则违反了此原则。但是,如果在测试期间启用此选项,则并非所有分支都可访问。因此,不建议使用此编译时选项。

SQLITE_ZERO_MALLOC

此选项从构建中省略 默认内存分配器调试内存分配器,并替换一个始终失败的存根内存分配器。SQLite 将无法使用此存根内存分配器运行,因为它将无法分配内存。但是,可以使用 sqlite3_config(SQLITE_CONFIG_MALLOC,...) 或 sqlite3_config(SQLITE_CONFIG_HEAP,...) 在启动时替换此存根。因此,此编译时选项的净效果是它允许 SQLite 编译并链接到不支持 malloc()、free() 和/或 realloc() 的系统库。

10. 分析和调试选项

SQLITE_DEBUG

SQLite 源代码包含数千个 assert() 语句,用于验证内部假设以及子程序的前提条件和后置条件。这些 assert() 语句通常处于关闭状态(它们不会生成任何代码),因为打开它们会导致 SQLite 的运行速度降低大约三倍。但在测试和分析中,打开 assert() 语句很有用。SQLITE_DEBUG 编译时选项可以做到这一点。

SQLITE_DEBUG 还启用了一些其他调试功能,例如用于打开跟踪和列表功能的特殊 PRAGMA 语句,这些功能用于故障排除和分析 VDBE 和代码生成器。

SQLITE_MEMDEBUG

SQLITE_MEMDEBUG 选项会导致 SQLite 中使用带仪器的 调试内存分配器 作为默认内存分配器。带仪器的内存分配器会检查动态分配内存的误用情况。误用示例包括在释放内存后使用内存、写入内存分配的末尾、释放之前未从内存分配器获取的内存或未能初始化新分配的内存。

11. Windows 特定选项

SQLITE_WIN32_HEAP_CREATE

此选项强制 Win32 本机内存分配器(如果启用)创建一个私有堆来保存所有内存分配。

SQLITE_WIN32_MALLOC_VALIDATE

此选项强制 Win32 本机内存分配器(如果启用)在也启用 assert() 的情况下对 HeapValidate() 函数进行策略性调用。

12. 编译器链接和调用约定控制

以下宏指定了某些类型的 SQLite 构建的接口详细信息。Makefile 通常会自动处理设置这些宏。应用程序开发人员无需担心这些宏。包含以下关于这些宏的文档是为了完整起见。

SQLITE_API

此宏标识 SQLite 的外部可见接口。此宏有时设置为“extern”。但定义是特定于编译器的。

SQLITE_APICALL

此宏标识 SQLite 中接受固定数量参数的公共接口例程使用的调用约定。此宏通常定义为空,但在 Windows 构建中,它有时可以设置为“__cdecl”或“__stdcall”。“__cdecl”设置是默认设置,但当 SQLite 旨在编译为 Windows 系统库时,会使用“__stdcall”。

单个函数声明不应包含以下内容中的多个:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_CALLBACK

此宏指定 SQLite 中回调指针使用的调用约定。此宏通常定义为空,但在 Windows 构建中,它有时可以设置为“__cdecl”或“__stdcall”。“__cdecl”设置是默认设置,但当 SQLite 旨在编译为 Windows 系统库时,会使用“__stdcall”。

SQLITE_CDECL

此宏指定 SQLite 中可变参数接口例程使用的调用约定。此宏通常定义为空,但在 Windows 构建中,它有时可以设置为“__cdecl”。此宏用于可变参数例程,因此不能设置为“__stdcall”,因为 __stdcall 调用约定不支持可变参数函数。

单个函数声明不应包含以下内容中的多个:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_EXTERN

此宏指定 SQLite 中公共接口变量的链接。它通常应该允许默认为“extern”。

SQLITE_STDCALL

此宏不再使用,现已弃用。

SQLITE_SYSAPI

此宏标识 SQLite 构建的目标平台的操作系统接口使用的调用约定。此宏通常定义为空,但在 Windows 构建中,它有时可以设置为“__stdcall”。

单个函数声明不应包含以下内容中的多个:SQLITE_APICALLSQLITE_CDECLSQLITE_SYSAPI

SQLITE_TCLAPI

此宏指定 TCL 库接口例程使用的调用约定。此宏不由 SQLite 内核使用,而仅由 TCL 接口TCL 测试套件 使用。此宏通常定义为空,但在 Windows 构建中,它有时可以设置为“__cdecl”。此宏用于 TCL 库接口例程,这些例程始终编译为 __cdecl,即使在更喜欢使用 __stdcall 的平台上也是如此,因此此宏不应设置为 __stdcall,除非平台具有支持 __stdcall 的自定义 TCL 库构建。

此宏不能与 SQLITE_APICALLSQLITE_CALLBACKSQLITE_CDECLSQLITE_SYSAPI 中的任何一个组合使用。

此页面上次修改于 2024-06-05 13:57:35 UTC