8+3 Filenames
SQLite And 8+3 Filenames
SQLite的默认配置假定底层文件系统支持长文件名。
SQLite不对数据库文件强加任何命名要求。SQLite将很乐意使用任何文件扩展名或根本没有扩展名的数据库文件。当回滚日志或预写日志或其他类型的临时磁盘文件需要辅助文件时,辅助文件的名称通常通过在数据库文件名的末尾添加后缀来构造。例如,如果原始数据库被调用“ app.db
”,则回滚日志将被称为“ app.db-journal
”,并且预写日志将被称为“ app.db-wal
”。这种辅助文件命名方法在支持长文件名的系统上效果很好。但在施加8 + 3文件名限制的系统上,
更改文件系统
针对此问题的建议修复方法是选择不同的文件系统。目前,有大量支持长文件名的高性能,可靠,无专利的文件系统可供选择。在可能的情况下,建议嵌入式设备使用其中一种文件系统。这将避免兼容性问题以及由不一致地使用8 + 3文件名造成的数据库损坏的危险。
调整SQLite以使用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文件名的数据库文件,而在其他情况下使用长文件名的情况相当于删除热日志。
SQLite在公共领域。