SQLite 默认设置为何如此糟糕?
SQLite should have (Rust-style) editions
SQLite 是嵌入式项目和本地数据存储的行业标准,甚至像 lobste.rs 这样的服务器软件也在用它。但作者指出,SQLite 的默认设置存在严重问题:外键约束默认关闭,导致数据一致性无法保证;类型系统过于宽松,允许在 INTEGER 列中存储文本。虽然可以通过 PRAGMA 或 strict 表来修复,但这需要开发者手动干预。作者呼吁 SQLite 应像 Rust 一样引入版本(editions)机制,让新代码默认采用更安全的严格模式,同时保留旧代码的灵活性,从而在保持 SQLite 灵活性的同时避免常见陷阱。
SQLite 的默认设置全错了。
HN 评论区
172- 有评论者指出 SQLite 作者反对强类型系统的论据存在 sunk cost fallacy,其声称从未见过类型系统能捕获的 bug 这一说法令人遗憾。
- 一位嵌入式系统从业者质疑当前默认设置,认为在嵌入式场景下不强制外键约束或允许将 blob 插入整数列毫无逻辑,且修改默认值不会破坏向后兼容性。
- 针对并发写入的误解,评论澄清 SQLite 并非无法处理多请求写入,而是通过事务机制让写入操作按毫秒级轮流执行,这与任何数据库的长事务锁机制本质相同。
- 有观点反驳将 WAL 模式设为默认值的提议,指出其作为不同的文件格式在许多平台上不受支持,且面临更高的静默损坏风险。
- 关于引入类似 Rust 的 Editions 机制,评论认为这能解锁用户对新特性的需求并推动生态系统发展,而非像 C++ 社区尝试的 Epochs 那样因问题过多而被放弃。