从版本3.7.7(2011-06-23)开始,可以将sqlite3_open(),sqlite3_open16()和sqlite3_open_v2()接口以及ATTACH命令的SQLite数据库文件参数 指定为普通文件名或统一资源标识符或URI。使用URI文件名的优点是URI上的查询参数可用于控制新创建的数据库连接的详细信息。例如,可以使用“ vfs =“查询参数来指定备用VFS。或者可以通过使用“ mode = ro”作为查询参数以只读方式打开数据库。
为了保持对旧应用程序的完全向后兼容性,默认情况下禁用URI文件名功能。可以使用SQLITE_USE_URI = 1 或SQLITE_USE_URI = 0编译时选项启用或禁用URI文件名。可以在启动时使用sqlite3_config(SQLITE_CONFIG_URI,1)或sqlite3_config(SQLITE_CONFIG_URI,0)配置调用在开始时更改URI文件名的编译时设置。无论编译时还是启动时设置,都可以通过将SQLITE_OPEN_URI位包含在作为F参数传递给sqlite3_open_v2(N,P,F,V)的位集中来为单个数据库连接启用URI文件名。 。
如果最初打开数据库连接时识别出URI文件名,则URI文件名也将在ATTACH语句中识别出来。同样,如果首次打开数据库连接时未识别URI文件名,那么ATTACH不会识别它们。
由于SQLite始终将不以“ file: ”开头的任何文件名都解释为普通文件名,而与URI设置无关,并且因为以“ file: ”开头的实际文件是非常不寻常的,所以对于大多数应用程序来说,这样做是安全的即使当前未使用URI文件名,也可以启用URI处理。
根据RFC 3986,URI由方案,授权,路径,查询字符串和片段组成。该方案始终是必需的。权限或路径之一也始终是必需的。查询字符串和片段是可选的。
SQLite使用“ file: ” URI语法来标识数据库文件。SQLite努力以与流行的网络浏览器(例如Firefox, Chrome, Safari, Internet Explorer和 Opera)以及命令行程序(例如 Windows“ start”和Mac OS-X “ open)完全相同的方式解释文件URI。 ”命令。URI解析规则的简要摘要如下:
路径,查询字符串或片段中可能出现零个或多个“ %HH ”形式的转义序列(其中H代表任何十六进制数字)。
不是格式正确的URI的文件名将被解释为普通文件名。
URI被作为UTF8文本处理。在处理之前,将文件名参数sqlite3_open16()从UTF16本机字节顺序转换为UTF8。
URI的路径组件指定磁盘文件,该磁盘文件是要打开的SQLite数据库。如果省略路径组件,则数据库存储在一个临时文件中,当数据库连接关闭时,该文件将自动删除。如果存在授权部分,则该路径始终是绝对路径名。如果省略了权限部分,则该路径以“ /”字符(ASCII代码0x2f)开头为绝对路径名,否则为相对路径名。在Windows上,如果绝对路径以“ / X:/ ”开头,其中X是任何单个ASCII字母字符(“ a”至“ z”或“ A”至“ Z”),则“ X:“”被理解为是包含文件而不是顶层目录的卷的驱动器号。
通常,可以通过以下所示的步骤将普通文件名转换为等效的URI。一个例外是,带有驱动器号的相对Windows路径名不能直接转换为URI。必须首先将其更改为绝对路径名。
URI文件名可以选择后面跟一个查询字符串。查询字符串由第一个“ ? ”字符后的文本组成,但不包括以“ # ”开头的可选片段。查询字符串分为键/值对。我们通常将这些键/值对称为“查询参数”。键/值对由单个“ & ”字符分隔。该键位于第一个位置,并且与值之间用单个“ = ”字符分隔。键和值都可以包含%HH转义序列。
查询参数的文本附加到VFS的xOpen方法的filename参数中。查询参数中的任何%HH转义序列都必须先解析,然后才能附加到xOpen文件名。单个零字节将xOpen文件名参数与第一个查询参数的键,每个键和值以及每个后续键与先前值分隔开。附加到xOpen文件名的查询参数列表由单个零长度键终止。请注意,查询参数的值可以是一个空字符串。
一些查询参数由SQLite核心解释,并用于修改新连接的特征。即使所有查询参数先前都是由SQLite核心读取和解释的,也始终传递到VFS的xOpen方法中。
SQLite从版本3.15.0(2016-10-14)起可以识别以下查询参数 。将来可能会添加新的查询参数。
缓存查询参数确定是使用共享缓存模式还是使用专用缓存打开新数据库。
不可变查询参数是一个布尔值,它向SQLite发出信号,通知其基础数据库文件位于只读介质上,并且即使具有更高特权的另一个进程也无法对其进行修改。SQLite始终以只读方式打开不可变数据库文件,并且跳过所有文件锁定并更改不可变数据库文件的更改检测。如果这些查询参数(或xDeviceCharacteristics中的SQLITE_IOCAP_IMMUTABLE位)断言数据库文件是不可变的,并且该文件无论如何都会发生更改,则SQLite可能返回错误的查询结果和/或SQLITE_CORRUPT错误。
模式查询参数确定是否以只读,读写,读写方式创建新数据库(如果不存在),或者该数据库是分别从不与磁盘交互的纯内存数据库。
在unix系统上的sqlite3_open_v2()期间创建新数据库文件时,SQLite将尝试设置新数据库文件的权限以匹配现有文件“ filename ”。
nolock查询参数是一个布尔值,当为true时,它将禁用对VFS的xLock,xUnlock和xCheckReservedLock方法的所有调用。例如,当尝试访问不支持文件锁定的文件系统上的文件时,可以使用nolock查询参数。警告:如果两个或多个数据库连接尝试与同一个SQLite数据库进行交互,并且其中一个或多个连接启用了“ nolock”,则可能导致数据库损坏。仅当应用程序可以保证对数据库的写操作已序列化时,才应使用“ nolock”查询参数。
psow查询参数将覆盖 正在打开的数据库文件的powersafe overwrite属性。psow查询参数可与默认的Windows和UNIX VFS一起使用,但对于其他专有或非标准VFS可能是无效的。
vfs查询参数导致使用名为NAME的VFS打开数据库连接。如果NAME不是SQLite内置的或先前使用sqlite3_vfs_register()注册 的VFS的名称,则打开尝试将失败。