统一资源标识符

1. SQLite 中的 URI 文件名

版本 3.7.7 (2011-06-23) 开始, sqlite3_open()sqlite3_open16()sqlite3_open_v2()接口以及ATTACH命令的 SQLite 数据库文件参数 可以指定为普通文件名或统一资源标识符或 URI。使用 URI 文件名的优点是 URI 上的查询参数可用于控制新创建的数据库连接的详细信息。例如,可以使用“vfs=”查询参数指定替代VFS 。或者可以使用“mode=ro”作为查询参数以只读方式打开数据库。

2.向后兼容

为了保持遗留应用程序的完全向后兼容性,默认情况下禁用 URI 文件名功能。可以使用SQLITE_USE_URI=1SQLITE_USE_URI=0编译时选项启用或禁用 URI 文件名。URI 文件名的编译时设置可以在启动时使用sqlite3_config ( SQLITE_CONFIG_URI ,1) 或sqlite3_config ( SQLITE_CONFIG_URI ,0) 配置调用进行更改。无论编译时或启动时设置如何,都可以通过将SQLITE_OPEN_URI位包含在作为 F 参数传递给sqlite3_open_v2(N,P,F,V)的位集中来为各个数据库连接启用 URI 文件名 .

如果 URI 文件名在最初打开数据库连接时被识别,那么 URI 文件名也将在ATTACH语句中被识别。同样,如果首次打开数据库连接时无法识别 URI 文件名,则ATTACH也无法识别它们。

由于 SQLite 总是将任何不以“ file: ”开头的文件名解释为普通文件名,而不管 URI 设置如何,并且因为实际文件以“ file: ”开头是非常不寻常的,所以对于大多数应用程序来说是安全的即使当前未使用 URI 文件名,也启用 URI 处理。

3.URI格式

根据RFC 3986,URI 由方案、权限、路径、查询字符串和片段组成。该计划始终是必需的。权限或路径之一也始终是必需的。查询字符串和片段是可选的。

SQLite 使用“ file: ”URI 语法来识别数据库文件。SQLite 努力以与流行的网络浏览器(如 FirefoxChromeSafariInternet ExplorerOpera)以及命令行程序(如 Windows“开始”和 Mac OS-X “打开”)完全相同的方式解释文件:URI 命令。URI 解析规则的简要总结如下:

  • URI 的方案必须是“文件: ”。任何其他方案都会导致输入被视为普通文件名。
  • 权限可以省略,可以为空,也可以是“ localhost ”。任何其他权限都会导致错误。例外:如果 SQLite 是用SQLITE_ALLOW_URI_AUTHORITY编译的, 那么除“localhost”之外的任何权限值都会作为 UNC 文件名传递给底层操作系统。
  • 如果权限存在,路径是可选的。如果省略权限,则需要路径。
  • 查询字符串是可选的。如果存在查询字符串,则所有查询参数都会传递到底层VFS的 xOpen 方法中。
  • 该片段是可选的。如果存在,它将被忽略。

路径、查询字符串或片段中可以出现零个或多个形式为“ % HH ”(其中H代表任何十六进制数字)的转义序列。

不是格式正确的 URI 的文件名被解释为普通文件名。

URI 作为 UTF8 文本处理。文件名参数 sqlite3_open16() 在处理之前从 UTF16 本机字节顺序转换为 UTF8。

3.1. URI 路径

URI 的路径部分指定磁盘文件,即要打开的 SQLite 数据库。如果省略路径部分,则数据库存储在一个临时文件中,当数据库连接关闭时该文件将自动删除。如果权限部分存在,则路径始终是绝对路径名。如果权限部分被省略,那么如果路径以“/”字符(ASCII 代码 0x2f)开头,则该路径是绝对路径名,否则是相对路径名。在 Windows 上,如果绝对路径以“ / X :/ ”开头,其中X是任何单个 ASCII 字母字符(“a”到“z”或“A”到“Z”),则“ X:" 被理解为包含文件的卷的驱动器号,而不是顶级目录。

普通文件名通常可以通过以下步骤转换为等效的 URI。一个例外是带有驱动器盘符的相对 Windows 路径名不能直接转换为 URI;必须首先将其更改为绝对路径名。

  1. 将所有“ ? ”字符转换为“ %3f ”。
  2. 将所有“ # ”字符转换为“ %23 ”。
  3. 仅在 Windows 上,将所有“ \ ”字符转换为“ / ”。
  4. 将两个或多个“ / ”字符的所有序列转换为单个“ / ”字符。
  5. 仅在 Windows 上,如果文件名以驱动器号开头,请在前面加上一个“ / ”字符。
  6. 前置“文件: ”方案。

3.2. 请求参数

URI 文件名后面可以有选择地跟一个查询字符串。查询字符串由第一个“ ? ”字符之后的文本组成,但不包括以“ # ”开头的可选片段查询字符串分为键/值对。我们通常将这些键/值对称为“查询参数”。键/值对由单个“ & ”字符分隔。键在前,并通过单个“ = ”字符与值分隔。键和值都可以包含%HH转义序列。

查询参数的文本附加到VFS 的 xOpen 方法的文件名参数查询参数中的任何 %HH 转义序列在附加到 xOpen 文件名之前都会被解析。单个零字节将 xOpen 文件名参数与第一个查询参数的键、每个键和值以及每个后续键与先前值分开。附加到 xOpen 文件名的查询参数列表由单个零长度密钥终止。请注意,查询参数的值可以是空字符串。

3.3. 识别的查询参数

一些查询参数由 SQLite 核心解释并用于修改新连接的特征。所有查询参数始终传递到VFS的 xOpen 方法中,即使它们之前已被 SQLite 核心读取和解释。

SQLite 从版本 3.15.0 (2016-10-14)开始 识别以下查询参数 。将来可能会添加新的查询参数。

cache=shared
cache=private

The cache query parameter determines if the new database is opened using shared cache mode or with a private cache.

immutable=1

The immutable query parameter is a boolean that signals to SQLite that the underlying database file is held on read-only media and cannot be modified, even by another process with elevated privileges. SQLite always opens immutable database files read-only and it skips all file locking and change detection on immutable database files. If this query parameter (or the SQLITE_IOCAP_IMMUTABLE bit in xDeviceCharacteristics) asserts that a database file is immutable and that file changes anyhow, then SQLite might return incorrect query results and/or SQLITE_CORRUPT errors.

mode=ro
mode=rw
mode=rwc
mode=memory

The mode query parameter determines if the new database is opened read-only, read-write, read-write and created if it does not exist, or that the database is a pure in-memory database that never interacts with disk, respectively.

modeof=filename

When creating a new database file during sqlite3_open_v2() on unix systems, SQLite will try to set the permissions of the new database file to match the existing file "filename".

nolock=1

The nolock query parameter is a boolean that disables all calls to the xLock, xUnlock, and xCheckReservedLock methods of the VFS when true. The nolock query parameter might be used, for example, when trying to access a file on a filesystem that does not support file locking. Caution: If two or more database connections try to interact with the same SQLite database and one or more of those connections has enabled "nolock", then database corruption can result. The "nolock" query parameter should only be used if the application can guarantee that writes to the database are serialized.

psow=0
psow=1

The psow query parameter overrides the powersafe overwrite property of the database file being opened. The psow query parameter works with the default windows and unix VFSes but might be a no-op for other proprietary or non-standard VFSes.

vfs=NAME

The vfs query parameter causes the database connection to be opened using the VFS called NAME. The open attempt fails if NAME is not the name of a VFS that is built into SQLite or that has been previously registered using sqlite3_vfs_register().

4.另见