SQLite 严格表:告别类型错误
Prefer Strict Tables in SQLite
我强烈建议在 SQLite 中使用严格表(strict tables),只需在表定义末尾加上 STRICT 关键字即可。这一特性能有效防止将文本误存入整数列等类型不匹配问题,还能在创建表时拦截无效的自定义数据类型。虽然 SQLite 官方推崇灵活的动态类型,但我认为严格类型能大幅减少隐蔽的 Bug,提升数据完整性。尽管迁移旧表稍显麻烦且需 SQLite 3.37.0+ 版本支持,但严格表带来的类型安全收益远大于这些成本,是提升代码质量的神器。
我宁愿这些错误大声报错,也不愿它们造成隐晦的麻烦。
- 有评论者指出,过度灵活的 schema 设计(如用 JSON 或 varchar 存储一切)常导致数据错乱和缺失必填字段,反而让维护成为噩梦。
- 一位开发者认为 SQLite 的 strict mode 限制了应用层定义更语义化的类型名称,若配合 Rust 的 sqlx 等工具,放弃 strict mode 可能更优。
- 多位用户强调 SQLite 默认不启用外键约束(FKs)且文档虽已说明但易被忽视,这反映了其向后兼容的妥协而非工程缺陷。
- 有观点反驳称,将类型校验完全推给应用层是合理的,因为静态类型语言本就能在编译期证明数据正确性,数据库层的重复校验对静态语言无益。
- 评论者提到 SQLite 故意保留非严格类型行为是为了让标准 SQL 代码能意外地在 SQLite 上运行,体现了其独特的兼容性设计哲学。