SQLite 的 NUMERIC 类型是如何存储的?

推荐答案

在 SQLite 中,NUMERIC 类型并不是一个具体的存储类型,而是一个类型亲和性(Type Affinity)。SQLite 会根据存储的值自动选择合适的存储类型。具体来说,NUMERIC 类型亲和性会优先将值存储为 INTEGERREAL,如果值不符合这两种类型,则会存储为 TEXTBLOB

本题详细解读

1. SQLite 的类型亲和性

SQLite 使用动态类型系统,这意味着数据的类型是由值本身决定的,而不是由列的类型决定的。SQLite 支持五种存储类型:

  • NULL: 表示空值。
  • INTEGER: 有符号整数,根据值的大小存储为 1、2、3、4、6 或 8 字节。
  • REAL: 浮点数,存储为 8 字节的 IEEE 浮点数。
  • TEXT: 文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
  • BLOB: 二进制大对象,完全按照输入存储。

2. NUMERIC 类型亲和性

NUMERIC 类型亲和性是一种列类型亲和性,它会影响 SQLite 如何存储数据。当列的类型亲和性为 NUMERIC 时,SQLite 会尝试将值存储为 INTEGERREAL。如果值不符合这两种类型,则会存储为 TEXTBLOB

具体来说,NUMERIC 类型亲和性的行为如下:

  • 如果值是一个整数,SQLite 会将其存储为 INTEGER
  • 如果值是一个浮点数,SQLite 会将其存储为 REAL
  • 如果值是一个文本字符串,SQLite 会尝试将其转换为 INTEGERREAL。如果转换成功,则存储为相应的类型;如果转换失败,则存储为 TEXT
  • 如果值是一个 BLOB,SQLite 会直接存储为 BLOB

3. 示例

假设有一个表 test,其中有一列 value 的类型亲和性为 NUMERIC

插入不同的值时,SQLite 会根据值的类型自动选择合适的存储类型:

4. 总结

NUMERIC 类型亲和性在 SQLite 中并不是一个具体的存储类型,而是一种列类型亲和性。它会根据存储的值自动选择合适的存储类型,优先选择 INTEGERREAL,如果值不符合这两种类型,则会存储为 TEXTBLOB

纠错
反馈