SQLite C 接口

打开一个新的数据库连接

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_open16(
  const void *filename,   /* Database filename (UTF-16) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
int sqlite3_open_v2(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb,         /* OUT: SQLite db handle */
  int flags,              /* Flags */
  const char *zVfs        /* Name of VFS module to use */
);

这些例程打开由文件名参数指定的 SQLite 数据库文件。文件名参数被解释为 sqlite3_open() 和 sqlite3_open_v2() 的 UTF-8 以及 sqlite3_open16() 的本机字节顺序中的 UTF-16。数据库连接句柄通常在 *ppDb 中返回,即使发生错误也是如此。唯一的例外是,如果 SQLite 无法分配内存来保存sqlite3对象,则会将 NULL 写入 *ppDb 而不是指向sqlite3 对象的指针。如果数据库成功打开(和/或创建),则 返回SQLITE_OK否则返回错误代码sqlite3_errmsg ( )sqlite3_errmsg16()例程可用于在任何 sqlite3_open() 例程失败后获取错误的英语描述。

对于使用 sqlite3_open() 或 sqlite3_open_v2() 创建的数据库,默认编码将为 UTF-8。使用 sqlite3_open16() 创建的数据库的默认编码将是本机字节顺序的 UTF-16。

无论打开时是否发生错误,与数据库连接句柄关联的资源都应在不再需要时通过将其传递给sqlite3_close()来释放。

sqlite3_open_v2() 接口的工作方式与 sqlite3_open() 类似,只是它接受两个附加参数以对新数据库连接进行额外控制。sqlite3_open_v2() 的标志参数必须至少包括以下三个标志组合之一:

SQLITE_OPEN_READONLY
数据库以只读模式打开。如果数据库尚不存在,则返回错误。

SQLITE_OPEN_READWRITE
如果可能,打开数据库以进行读写,或者仅在文件被操作系统写保护时才进行读取。在任何一种情况下,数据库都必须已经存在,否则将返回错误。

SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
数据库以读写方式打开,如果不存在则创建。这是始终用于 sqlite3_open() 和 sqlite3_open16() 的行为。

除了必需的标志外,还支持以下可选标志:

SQLITE_OPEN_URI
如果设置了此标志,则文件名可以解释为 URI。

SQLITE_OPEN_MEMORY
该数据库将作为内存数据库打开。如果启用了共享缓存模式,则数据库由“文件名”参数命名,用于缓存共享,但“文件名”将被忽略。

SQLITE_OPEN_NOMUTEX
新的数据库连接将使用“多线程” 线程模式这意味着允许单独的线程同时使用 SQLite,只要每个线程使用不同的数据库连接即可。

SQLITE_OPEN_FULLMUTEX
新的数据库连接将使用“序列化” 线程模式这意味着多个线程可以安全地同时尝试使用同一个数据库连接。(互斥量会阻止任何实际的并发,但在这种模式下尝试并没有坏处。)

SQLITE_OPEN_SHAREDCACHE
数据库打开时启用共享缓存,覆盖sqlite3_enable_shared_cache()提供的默认共享缓存设置

SQLITE_OPEN_PRIVATECACHE
数据库打开共享缓存禁用,覆盖sqlite3_enable_shared_cache()提供的默认共享缓存设置

SQLITE_OPEN_EXRESCODE
数据库连接以“扩展结果代码模式”出现。换句话说,数据库的行为有 if sqlite3_extended_result_codes(db,1)一旦连接被创建就调用数据库连接。除了设置扩展结果代码模式外,该标志还导致sqlite3_open_v2() 返回扩展结果代码。

SQLITE_OPEN_NOFOLLOW
数据库文件名不允许是符号链接

如果 sqlite3_open_v2() 的第三个参数不是上面显示的必需组合之一,可以选择与其他 SQLITE_OPEN_* 位组合, 则行为未定义。SQLite 的历史版本已经默默地忽略了 sqlite3_open_v2() 的 flags 参数中的多余位,但是这种行为可能不会延续到 SQLite 的未来版本中,因此应用程序不应依赖它。特别注意 SQLITE_OPEN_EXCLUSIVE 标志是 sqlite3_open_v2() 的空操作。如果数据库已经存在,SQLITE_OPEN_EXCLUSIVE *不会*导致打开失败。SQLITE_OPEN_EXCLUSIVE 标志仅供VFS 接口使用,而不供 sqlite3_open_v2() 使用。

sqlite3_open_v2() 的第四个参数是 sqlite3_vfs对象的名称,它定义了新数据库连接应该使用的操作系统接口。如果第四个参数是 NULL 指针,则使用默认的sqlite3_vfs对象。

如果文件名为“:memory:”,则会为连接创建一个私有的临时内存数据库。当数据库连接关闭时,这个内存数据库将消失。SQLite 的未来版本可能会使用以“:”字符开头的其他特殊文件名。建议当数据库文件名确实以“:”字符开头时,您应该在文件名前加上路径名(例如“./”)以避免歧义。

如果文件名是空字符串,则会创建一个私有的临时磁盘数据库。一旦数据库连接关闭,这个私有数据库就会自动删除。

URI 文件名

如果启用URI 文件名解释,并且文件名参数以“file:”开头,则文件名被解释为 URI。如果在 sqlite3_open_v2() 的第三个参数中设置了SQLITE_OPEN_URI标志,或者如果使用带有sqlite3_config()方法的SQLITE_CONFIG_URI选项 或通过SQLITE_USE_URI编译时选项全局启用它,则启用 URI 文件名解释。URI 文件名解释默认关闭,但 SQLite 的未来版本可能默认启用 URI 文件名解释。有关其他信息,请参阅“ URI 文件名”。

URI 文件名根据 RFC 3986 进行解析。如果 URI 包含权限,则它必须是空字符串或字符串“localhost”。如果 authority 不是空字符串或“localhost”,则向调用者返回错误。URI 的片段组件(如果存在)将被忽略。

SQLite 使用 URI 的路径部分作为包含数据库的磁盘文件的名称。如果路径以“/”字符开头,则它被解释为绝对路径。如果路径不以“/”开头(意味着授权部分从 URI 中省略),则该路径被解释为相对路径。在 Windows 上,绝对路径的第一个组成部分是驱动器说明(例如“C:”​​)。

URI 的查询组件可能包含由 SQLite 本身或自定义 VFS 实现解释的参数。SQLite 及其内置的VFSes解释以下查询参数:

在 URI 的查询组件中指定未知参数不是错误。SQLite 的未来版本可能会理解额外的查询参数。有关其他信息,请参阅“对 SQLite 具有特殊含义的查询参数”。

URI 文件名示例

URI filenames Results
file:data.db Open the file "data.db" in the current directory.
file:/home/fred/data.db
file:///home/fred/data.db
file://localhost/home/fred/data.db
Open the database file "/home/fred/data.db".
file://darkstar/home/fred/data.db An error. "darkstar" is not a recognized authority.
file:///C:/Documents%20and%20Settings/fred/Desktop/data.db Windows only: Open the file "data.db" on fred's desktop on drive C:. Note that the %20 escaping in this example is not strictly necessary - space characters can be used literally in URI filenames.
file:data.db?mode=ro&cache=private Open file "data.db" in the current directory for read-only access. Regardless of whether or not shared-cache mode is enabled by default, use a private cache.
file:/home/fred/data.db?vfs=unix-dotfile Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" that uses dot-files in place of posix advisory locking.
file:data.db?mode=readonly An error. "readonly" is not a valid option for the "mode" parameter. Use "ro" instead: "file:data.db?mode=ro".

URI 的路径和查询组件支持 URI 十六进制转义序列 (%HH)。十六进制转义序列由一个百分号 - “%” - 后跟两个指定八位位组值的十六进制数字组成。在解释 URI 文件名的路径或查询组件之前,它们使用 UTF-8 编码,所有十六进制转义序列替换为包含相应八位组的单个字节。如果此过程生成无效的 UTF-8 编码,则结果未定义。

Windows 用户注意: 用于 sqlite3_open() 和 sqlite3_open_v2() 的文件名参数的编码必须是 UTF-8,而不是当前定义的任何代码页。包含国际字符的文件名在传递到 sqlite3_open() 或 sqlite3_open_v2() 之前必须转换为 UTF-8。

Windows 运行时用户请注意: 必须在调用 sqlite3_open() 或 sqlite3_open_v2() 之前设置临时目录。否则,需要使用临时文件的各种功能可能会失败。

另见:sqlite3_temp_directory

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