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 对象,则将在 *ppDb 中写入 NULL 而不是指向 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() 的 flags 参数必须至少包含以下三个标志组合之一
除了必需的标志外,还支持以下可选标志
如果 sqlite3_open_v2() 的第三个参数不是上面显示的必需组合之一,可以选择与其他 SQLITE_OPEN_* 位 组合使用,则行为是不确定的。SQLite 的历史版本会默默忽略 flags 参数对 sqlite3_open_v2() 的多余位,但这种行为可能不会延续到 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 文件名 解释,并且文件名参数以“file:”开头,则文件名将解释为 URI。如果在 sqlite3_open_v2() 的第三个参数中设置了 SQLITE_OPEN_URI 标志,或者使用 SQLITE_CONFIG_URI 选项和 sqlite3_config() 方法或 SQLITE_USE_URI 编译时选项全局启用,则启用 URI 文件名解释。默认情况下 URI 文件名解释处于关闭状态,但 SQLite 的未来版本可能会默认启用 URI 文件名解释。有关更多信息,请参见“URI 文件名”。
URI 文件名根据 RFC 3986 进行解析。如果 URI 包含权限,则它必须为空字符串或字符串“localhost”。如果权限不是空字符串或“localhost”,则向调用者返回错误。如果存在 URI 的片段组件,则将其忽略。
SQLite 使用 URI 的路径组件作为包含数据库的磁盘文件的名称。如果路径以“/”字符开头,则将其解释为绝对路径。如果路径不以“/”字符开头(表示从 URI 中省略了权限部分),则路径将解释为相对路径。在 Windows 上,绝对路径的第一个组件是驱动器规范(例如“C:”)。
URI 的查询组件可能包含参数,这些参数由 SQLite 本身或 自定义 VFS 实现 解释。SQLite 及其内置的 VFS 解释以下查询参数
在 URI 的查询组件中指定未知的参数不是错误。SQLite 的未来版本可能会理解其他查询参数。有关更多信息,请参见“具有对 SQLite 的特殊意义的查询参数”。
URI 文件名 | 结果 |
---|---|
file:data.db | 在当前目录中打开文件“data.db”。 |
file:/home/fred/data.db file:///home/fred/data.db file://127.0.0.1/home/fred/data.db | 打开数据库文件 "/home/fred/data.db"。 |
file://darkstar/home/fred/data.db | 错误。"darkstar" 不是一个认可的授权。 |
file:///C:/Documents%20and%20Settings/fred/Desktop/data.db | 仅限 Windows:打开 C 盘 fred 桌面上的 "data.db" 文件。请注意,此示例中的 %20 转义不是严格必需的 - URI 文件名中可以使用空格字符。 |
file:data.db?mode=ro&cache=private | 以只读方式打开当前目录中的 "data.db" 文件。无论默认情况下是否启用了共享缓存模式,都使用私有缓存。 |
file:/home/fred/data.db?vfs=unix-dotfile | 打开 "/home/fred/data.db" 文件。使用特殊 VFS "unix-dotfile",它使用点文件代替 posix 咨询锁定。 |
file:data.db?mode=readonly | 错误。"readonly" 不是 "mode" 参数的有效选项。使用 "ro" 代替:"file:data.db?mode=ro"。 |
URI 十六进制转义序列 (%HH) 在 URI 的路径和查询组件中受支持。十六进制转义序列由一个百分号 - "%" - 后跟两个十六进制数字组成,用于指定一个八位字节值。在解释 URI 文件名的路径或查询组件之前,它们将使用 UTF-8 编码,所有十六进制转义序列将被替换为包含对应八位字节的单个字节。如果此过程生成无效的 UTF-8 编码,则结果未定义。
Windows 用户注意事项:sqlite3_open() 和 sqlite3_open_v2() 的文件名参数使用的编码必须是 UTF-8,而不是当前定义的任何代码页。包含国际字符的文件名必须在传递给 sqlite3_open() 或 sqlite3_open_v2() 之前转换为 UTF-8。
Windows Runtime 用户注意事项:必须在调用 sqlite3_open() 或 sqlite3_open_v2() 之前设置临时目录。否则,需要使用临时文件的各种功能可能会失败。