SQLite 的默认配置假设底层文件系统支持长文件名。
SQLite 对数据库文件的命名没有强制要求。SQLite 可以愉快地使用任何文件名扩展名或根本没有扩展名的数据库文件。当需要辅助文件用于 回滚日志 或 预写日志 或其他类型的 临时磁盘文件 时,辅助文件的名称通常是通过在数据库文件名末尾附加后缀来构造的。例如,如果原始数据库名为“app.db”,则 回滚日志 将称为“app.db-journal”,而 预写日志 将称为“app.db-wal”。这种辅助文件命名方法在支持长文件名的系统上非常有效。但在强制执行 8+3 文件名约束的系统上,即使原始数据库文件符合 8+3 格式,辅助文件也不符合 8+3 格式。
解决此问题的推荐方法是选择一个不同的文件系统。如今,有大量高性能、可靠且无专利的文件系统支持长文件名。在可能的情况下,建议嵌入式设备使用这些其他文件系统之一。这将避免兼容性问题以及 由于不一致地使用 8+3 文件名导致的数据库损坏 的风险。
某些设备由于向后兼容性或其他非技术因素而被迫使用具有 8+3 文件名限制的旧文件系统。在这种情况下,可以强制 SQLite 使用符合 8+3 模式的辅助文件,如下所示
使用编译时选项 SQLITE_ENABLE_8_3_NAMES=1 或 SQLITE_ENABLE_8_3_NAMES=2 编译 SQLite 库。默认情况下,SQLite 中不包含对 8+3 文件名的支持,因为它确实会引入一些开销。开销很小,但即便如此,我们也不希望给数十亿不需要 8+3 文件名支持的 SQLite 应用程序带来负担。
如果使用 SQLITE_ENABLE_8_3_NAMES=1 选项,则 SQLite 能够使用 8+3 文件名,但该功能被禁用,必须在使用 URI 文件名 打开或附加数据库文件时,通过使用 打开 或 附加 数据库文件并包含“8_3_names=1”查询参数在 URI 中单独为每个数据库连接启用。如果使用 SQLITE_ENABLE_8_3_NAMES=2 编译 SQLite,则默认启用 8+3 文件名,可以跳过此步骤。
确保数据库文件名遵循 8+3 文件名格式,并且它们没有空名称或扩展名。换句话说,数据库文件名必须在基本名称中包含 1 到 8 个字符,在扩展名中包含 1 到 3 个字符。不允许使用空白扩展名。
使用上述步骤时,SQLite 将通过仅使用扩展名的最后 3 个字符来缩短文件名扩展名。因此,例如,一个通常称为“app.db-journal”的文件将缩短为“app.nal”。类似地,“app.db-wal”将变为“app.wal”,而“app.db-shm”变为“app.shm".
请注意,数据库文件名必须具有一定的扩展名非常重要。如果没有扩展名,则 SQLite 会通过附加到文件的基名称来创建辅助文件名。因此,名为“db01”的数据库将有一个名为“db01-journal”的 回滚日志 文件。由于此文件名没有要缩短为 3 个字符的扩展名,因此将按原样使用,并将违反 8+3 命名规则。
如果使用 8+3 命名而不是默认的长文件名访问数据库文件,则每次打开数据库时,每个数据库连接都必须一致地使用 8+3 命名访问它,否则存在数据库损坏的风险。辅助 回滚日志 和 预写日志 文件对于 SQLite 能够从崩溃中恢复至关重要。如果应用程序使用 8+3 名称并崩溃,则安全恢复崩溃所需的信息将存储在扩展名为“.nal”或“.wal”的文件中。如果下一个打开数据库的应用程序未指定“8_3_names=1”URI 参数,则 SQLite 将使用长文件名尝试查找回滚日志或预写日志文件。它将找不到它们,因为它们是由崩溃的应用程序使用 8+3 名称保存的,因此数据库将无法正确恢复,并且很可能会损坏。
在某些情况下使用具有 8+3 文件名的数据库文件,而在其他情况下使用长文件名,这等同于 删除热日志。
此页面上次修改于 2022-01-08 05:02:57 UTC