SQLite 数据类型概述

SQLite 数据类型概述

SQLite 采用动态类型系统,数据类型由值本身而非列定义决定。列的类型声明仅为"类型亲和性"(Type Affinity),用于指导数据存储方式。以下是 SQLite 支持的核心数据类型和亲和性分类:


存储类(Storage Classes)

SQLite 实际存储数据时使用以下五种存储类:

  1. NULL

    表示空值,与任何其他类型均不相同。

  2. INTEGER

    带符号整数,根据值大小以 1、2、3、4、6 或 8 字节存储。

  3. REAL

    浮点数,以 8 字节 IEEE 754 格式存储。

  4. TEXT

    字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。

  5. BLOB

    二进制数据,完全按输入存储,不做任何转换。


类型亲和性(Type Affinity)

列定义中的类型名称会被映射为以下五种亲和性之一,影响数据插入时的转换规则:

  1. INTEGER

    匹配 INTTINYINTBIGINT 等含 "INT" 关键字的类型声明。

  2. REAL

    匹配 REALFLOATDOUBLE 等浮点类型声明。

  3. TEXT

    匹配 CHARVARCHARTEXT 等字符串类型声明。

  4. BLOB

    仅匹配明确声明为 BLOB 或无类型的情况。

  5. NUMERIC

    默认亲和性,匹配其他类型名(如 BOOLEANDATE),尝试优先转换为 INTEGER 或 REAL。


类型转换规则

插入数据时,SQLite 按以下规则处理类型亲和性:

  • INTEGER 亲和性

    尝试将值转换为 INTEGER。若 TEXT 格式为整数或 REAL 无小数部分,则转换;否则存储为 REAL 或 TEXT。

  • REAL 亲和性

    尝试转换为 REAL,失败时存储为 TEXT。

  • TEXT 亲和性

    将值转换为 TEXT 格式。

  • BLOB 亲和性

    不进行任何转换。

  • NUMERIC 亲和性

    优先尝试 INTEGER,其次 REAL,最后 TEXT 或 BLOB。


示例代码

创建表时类型声明的亲和性映射示例:

sql 复制代码
CREATE TABLE example (
    col1 INTEGER,      -- INTEGER 亲和性
    col2 REAL,         -- REAL 亲和性
    col3 TEXT,         -- TEXT 亲和性
    col4 BLOB,         -- BLOB 亲和性
    col5 BOOLEAN       -- NUMERIC 亲和性(非标准类型名)
);

插入数据时的自动转换:

sql 复制代码
INSERT INTO example VALUES 
    (123, 45.67, 'hello', x'0102', TRUE);  -- BOOLEAN 存储为 INTEGER 1

注意事项

  1. 动态类型灵活性

    同一列可存储不同类型的数据,例如 INTEGER 列可存储 TEXT "123"。

  2. 日期和时间

    SQLite 无内置日期类型,通常以 TEXT(ISO8601)、REAL(Julian Day)或 INTEGER(Unix Time)存储。

  3. 布尔值

    使用 01 表示,亲和性为 NUMERIC 或 INTEGER。

相关推荐
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_6 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森7 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_7 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白8 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
窝子面8 小时前
手搓最简前后端协作-node
javascript·数据库
吳所畏惧9 小时前
宝塔面板Redis密码修改指南:SSH命令修改 vs 面板UI界面修改,哪个更靠谱?
运维·服务器·数据库·redis·缓存·ssh