SQLite 数据库大小列数据类型注意事项

SQLite DB Size Column Data Type Considerations

我正在使用 SQLite 数据库,其中所有列都是 NVARCHAR 数据类型。

来自 MS SQL 背景我知道 NVARCHAR 有额外的负担,我的第一个冲动是重构大多数列类型以强制执行具体的字符串长度(大多数长度低于 50 个字符)。

但同时我知道 SQLite 处理事情的方式有点不同。

所以我的问题是我应该 change/refactor 列类型吗?这样做在磁盘 space 或 SQLite 中的性能方面有什么好处吗?

DB 在 Android/iOS 台设备上运行。

谢谢!

你应该阅读 https://www.sqlite.org/datatype3.html

字符 (20)、VARCHAR(255)、可变字符 (255)、NCHAR(55) NATIVE CHARACTER(70)、NVARCHAR(100)、TEXT 和 CLOB 被视为 TEXT。

而且 SQLite 不强制长度。

因此,我没有深入研究评论家文档,而是对列类型进行了一些试验。

我正在使用的数据库有超过 100 万条记录,大多数列为 NVARCHAR,因此在文件大小增量中很容易看到列数据类型的任何更改。

以下是我在努力减小数据库大小时发现的结果:

  • NVARCHAR: 最大的节省来自尽可能将列类型从 NVARCHAR 切换为普通 INT 或 FLOAT。在一个 80MB 的 DB 文件上,以兆字节为单位,非常明显。通过一些额外的重构,我将大小降低到 47MB。

  • NVARCHAR 与 VARCHAR: 差别很小,在 80MB 大小的数据库上可能只有几 KB

  • NVARCHAR 与其他字符串类型: 在各种基于字符串的类型之间切换几乎没有区别,因为文档指出所有字符串类型在 SQLite 中都以相同的方式存储,如 TEXT

  • INT 与其他数字 这里没有区别,SQLite 最后都存储为 NUMBER。

  • 基于 NVARCHAR 列的索引也占用了更多 space,一旦在 INT 列上重新建立索引,我减少了一些 MB