int sqlite3_open( const char *文件名,/ *数据库文件名(UTF-8)* / sqlite3 ** ppDb / * OUT:SQLite数据库句柄* / ); int sqlite3_open16( const void *文件名,/ *数据库文件名(UTF-16)* / sqlite3 ** ppDb / * OUT:SQLite数据库句柄* / ); int sqlite3_open_v2( const char *文件名,/ *数据库文件名(UTF-8)* / sqlite3 ** ppDb,/ * OUT:SQLite数据库句柄* / int标志,/ *标志* / const char * zVfs / *要使用的VFS模块的名称* / );
这些例程打开由filename参数指定的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()的flags参数必须至少包括以下三个标志组合之一:
除了必需的标志之外,还支持以下可选标志:
如果sqlite3_open_v2()的第三个参数不是上面显示的必需组合之一,可以选择与其他SQLITE_OPEN_ *位组合, 则该行为是不确定的。
sqlite3_open_v2()的第四个参数是sqlite3_vfs对象的名称,该 对象定义新数据库连接应使用的操作系统接口。如果第四个参数是NULL指针,则使用默认的sqlite3_vfs对象。
如果文件名是“:memory:”,则将为连接创建一个私有的临时内存数据库。关闭数据库连接后,此内存数据库将消失。SQLite的未来版本可能会使用以“:”字符开头的其他特殊文件名。建议当数据库文件名实际上确实以“:”字符开头时,应在文件名前加上路径名(例如“ ./”),以避免歧义。
如果文件名是一个空字符串,则将创建一个私有的临时磁盘数据库。关闭数据库连接后,该私有数据库将被自动删除。
如果启用了URI文件名解释,并且filename参数以“ file:”开头,则文件名将被解释为URI。如果在sqlite3_open_v2()的第三个参数中设置了SQLITE_OPEN_URI标志,或者已使用带有sqlite3_config()方法的SQLITE_CONFIG_URI选项 或通过SQLITE_USE_URI编译时选项在全局范围内启用了SQLITE_OPEN_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文件名 | 结果 |
---|---|
文件:data.db | 在当前目录中打开文件“ data.db”。 |
文件:/home/fred/data.db 文件:///home/fred/data.db 文件://localhost/home/fred/data.db | 打开数据库文件“ /home/fred/data.db”。 |
文件://darkstar/home/fred/data.db | 一个错误。“暗黑之星”不是公认的权威。 |
文件:/// C:/Documents%20and%20Settings/fred/Desktop/data.db | 仅限Windows:在驱动器C:的fred桌面上打开文件“ data.db”。请注意,在此示例中转义%20并非绝对必要-可以在URI文件名中原样使用空格字符。 |
文件:data.db?mode = ro&cache = private | 在当前目录中打开文件“ data.db”以进行只读访问。无论默认情况下是否启用共享缓存模式,都应使用专用缓存。 |
文件:/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的路径和查询组件支持URI十六进制转义序列(%HH)。十六进制转义序列由一个百分号-“%”-后面紧跟两个指定十六进制值的十六进制数字。在解释URI文件名的路径或查询成分之前,它们使用UTF-8进行编码,并且所有十六进制转义序列都被包含相应八位位组的单个字节替换。如果此过程生成无效的UTF-8编码,则结果不确定。
Windows用户注意: sqlite3_open()和sqlite3_open_v2()的filename参数使用的编码必须为UTF-8,而不是当前定义的任何代码页。在将包含国际字符的文件名传递到sqlite3_open()或sqlite3_open_v2()之前,必须先将其转换为UTF-8。
Windows运行时用户注意: 必须在调用sqlite3_open()或sqlite3_open_v2()之前设置临时目录。否则,要求使用临时文件的各种功能可能会失败。