
SQLite 数据类型
SQLite字段类型详细说明,包含存储类、亲和类型、布尔类型、日期时间类型的存储方式、取值范围及核心特性。
创建 SQLite3
表时可使用的各种数据类型名称,同时也介绍了相应的亲和类型。
一、核心存储类(Storage Classes)
所有数据均以以下5种存储类之一存储,是SQLite数据的底层存储形式:
存储类 | 详细描述 | 存储方式 | 取值范围 |
---|---|---|---|
NULL | 表示字段无值,无实际数据内容。 | 以NULL 标记存储(固定占用1字节标识)。 |
仅包含NULL 一个值。 |
INTEGER | 带符号整数,根据值的大小动态选择存储字节(1、2、3、4、6或8字节)。 | 以二进制补码形式存储,小端序编码(按值大小自动适配字节长度)。 | 按存储字节数划分: - 1字节:-128 到 127 - 2字节:-32768 到 32767 - 3字节:-8388608 到 8388607 - 4字节:-2147483648 到 2147483647 - 6字节:-281474976710656 到 281474976710655 - 8字节:-9223372036854775808 到 9223372036854775807 |
REAL | 浮点数值,固定为8字节存储。 | 以8字节IEEE 754双精度浮点格式存储(含符号位、指数位、尾数位)。 | 取值范围:±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸(精度约15-17位小数)。 |
TEXT | 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。 文本字符串,依赖数据库编码存储。 | 以数据库指定编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数。 | 无严格长度限制(受数据库文件大小限制),支持所有Unicode字符。 |
BLOB | 二进制大对象,不进行任何编码转换。 | 原样存储输入的二进制数据,带长度前缀标识数据字节数。 | 无严格长度限制(受数据库文件大小限制),支持任意二进制数据(如图片、文件片段)。 |
二、亲和类型(Affinity)
SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型 。
字段类型名称定义"亲和性"(优先存储的类型),而非强制类型。以下是文档明确的类型名称与亲和类型对应关系及特性:
亲和类型 | 对应的数据类型名称(创建表时可使用) | 核心特性(数据插入时的转换规则) |
---|---|---|
TEXT | CHARACTER(20)、VARCHAR(255)、VARYING CHARACTER(255)、NCHAR(55)、NATIVE CHARACTER(70)、NVARCHAR(100)、TEXT、CLOB | 优先将数据转换为TEXT存储:数值型数据(INTEGER/REAL)会先转为文本格式,BLOB会转为十六进制文本。 |
NUMERIC | NUMERIC、DECIMAL(10,5)、BOOLEAN、DATE、DATETIME | 优先转换为数值类型(INTEGER/REAL): - 文本可无损转为数值时,自动转为INTEGER或REAL(如"123"→123,"3.14"→3.14); - 转换失败或为NULL/BLOB时,保留原类型存储; - 浮点文本"30000.0"可转为INTEGER(因无信息丢失)。 |
INTEGER | INT、INTEGER、TINYINT、SMALLINT、MEDIUMINT、BIGINT、UNSIGNED BIG INT、INT2、INT8 | 规则同NUMERIC,仅在CAST表达式处理时更倾向整数(如CAST("3.0" AS INTEGER)结果为3)。 |
REAL | REAL、DOUBLE、DOUBLE PRECISION、FLOAT | 优先转换为REAL:文本可转为浮点数时自动转换(如"3"→3.0),但"30000.0"不会转为INTEGER(区别于NUMERIC)。 |
NONE | BLOB、未指定类型(如CREATE TABLE t (col); ) |
不进行任何转换,直接以原始存储类存储(如BLOB保持二进制,TEXT保持字符串)。 |
三、Boolean类型
SQLite无专门的Boolean存储类,通过INTEGER存储:
类型 | 存储方式 | 取值范围 | 说明 |
---|---|---|---|
BOOLEAN | 以INTEGER存储 | 0(false)、1(true) | 亲和类型为NUMERIC,插入时会按NUMERIC规则转换(如"true"会尝试转为1)。 |
四、Date与Time类型
无专门存储类,可通过TEXT、REAL、INTEGER存储,文档明确格式如下:
存储类 | 存储方式 | 日期时间格式 | 取值范围(基于存储类) |
---|---|---|---|
TEXT | 以TEXT存储,采用数据库编码 | 格式为"YYYY-MM-DD HH:MM:SS.SSS"(如"2023-10-01 15:30:45.123") | 无严格范围,受TEXT长度限制(需符合ISO 8601格式)。 |
REAL | 以8字节REAL存储 | 表示从公元前4714年11月24日格林尼治时间正午开始的天数(Julian天数) | 同REAL的取值范围(±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸),可覆盖极广时间范围。 |
INTEGER | 以INTEGER存储 | 表示从1970-01-01 00:00:00 UTC开始的秒数(Unix时间戳) | 同INTEGER的8字节范围:0 到 9223372036854775807(对应约公元292亿年)。 |
关键说明
- 存储类是数据的实际存储形式,亲和类型仅影响插入时的优先转换规则,不限制实际存储的类型(如INTEGER亲和性字段可存储TEXT)。
- 若需严格限制取值范围(如年龄0-120),需通过
CHECK
约束实现(如age INTEGER CHECK (age BETWEEN 0 AND 120)
)。 - 日期时间可通过内置函数转换(如
datetime(ts, 'unixepoch')
将Unix时间戳转为TEXT格式)。
TEXT类型:文本字符串
- 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
- 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。
字段名称 | 详细说明 | 存储方式 | 取值范围 | 示例值 |
---|---|---|---|---|
CHARACTER(20) 小写character(20) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的20表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为20个字符,无严格上限(受数据库文件大小限制),支持所有Unicode字符 | "SQLite text 20 chars"(约20个字符) |
VARCHAR(255) 小写varchar(255) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的255表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为255个字符,无严格上限,支持所有Unicode字符 | "这是一个长度约50的文本字符串,用于示例varchar(255)字段" |
VARYING CHARACTER(255) 小写varying character(255) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的255表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为255个字符,无严格上限,支持所有Unicode字符 | "Varying character示例,长度控制在255以内" |
NCHAR(55) 小写nchar(55) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的55表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为55个字符,无严格上限,支持所有Unicode字符 | "NCHAR字段示例,字符长度接近55个,用于测试存储效果" |
NATIVE CHARACTER(70) 小写native character(70) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的70表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为70个字符,无严格上限,支持所有Unicode字符 | "Native Character字段的示例文本,长度大约70个字符,展示存储特性" |
NVARCHAR(100) 小写nvarchar(100) | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;括号中的100表示建议的字符长度 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,建议长度为100个字符,无严格上限,支持所有Unicode字符 | "NVARCHAR(100)示例:这是一个较长的文本,用于测试该字段的存储能力,长度控制在100字符左右" |
TEXT 小写text | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;无建议长度限制 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,无严格长度限制(受数据库文件大小限制),支持所有Unicode字符 | "这是一个普通TEXT字段的示例文本,可长可短,不受固定长度限制" |
CLOB 小写clob | 亲和类型为TEXT,数据插入时优先转换为文本格式存储;数值型数据会转为文本,BLOB会转为十六进制文本;通常用于存储大文本数据 | 使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,带长度前缀标识字符串字节数 | 文本字符串,适合存储大文本(如文档内容),无严格上限(受数据库文件大小限制),支持所有Unicode字符 | "CLOB字段用于存储大文本,例如这是一段较长的文章内容,可能包含多个段落、标点符号和特殊字符..." |
NUMERIC类型: 数字
当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。
字段名称 | 详细说明 | 存储方式 | 取值范围 | 示例值 |
---|---|---|---|---|
NUMERIC 小写numeric | 亲和类型为NUMERIC,数据插入时优先转换为数值类型(INTEGER或REAL);文本可无损转为数值时自动转换(如"123"→123),转换失败或为NULL/BLOB时保留原类型;浮点文本"30000.0"可转为INTEGER(无信息丢失) | 转换为INTEGER时按1、2、3、4、6或8字节动态存储;转换为REAL时按8字节IEEE浮点存储;TEXT/BLOB按对应存储类存储 | 若为INTEGER:-128到127(1字节)、-32768到32767(2字节)等;若为REAL:±1.7×10⁻³⁰⁸到±1.7×10³⁰⁸;TEXT/BLOB同对应存储类范围 | 123(INTEGER)、3.14(REAL)、"无法转换的文本"(TEXT) |
DECIMAL(10,5) 小写decimal(10,5) | 亲和类型为NUMERIC,规则同NUMERIC;括号中(10,5)表示总位数10位、小数位5位(语义上的数值格式) | 转换为INTEGER/REAL时按对应存储类存储;TEXT/BLOB按对应存储类存储 | 数值需符合"总位数10位、小数位5位"语义(如123.45678);其他类型同对应存储类范围 | 123.45678(符合10位总长度、5位小数)、12345.67890 |
BOOLEAN 小写boolean | 亲和类型为NUMERIC,无专门存储类,通过INTEGER存储;0表示false,1表示true;插入时按NUMERIC规则转换(如"true"→1) | 以INTEGER存储,按值大小动态使用1-8字节(二进制补码) | 仅0(false)、1(true) | 0(false)、1(true) |
DATE 小写date | 亲和类型为NUMERIC,无专门存储类,可存储为TEXT(日期字符串)、REAL(Julian天数)或INTEGER(Unix时间戳);插入时按NUMERIC规则转换 | 为TEXT时按数据库编码存储;为REAL时按8字节IEEE浮点存储;为INTEGER时按动态字节存储 | 若为TEXT:符合"YYYY-MM-DD"格式字符串;若为REAL:±1.7×10⁻³⁰⁸到±1.7×10³⁰⁸;若为INTEGER:-9223372036854775808到9223372036854775807 | "2023-10-01"(TEXT)、2459876.5(REAL,Julian天数)、1696107000(INTEGER,Unix时间戳) |
DATETIME 小写datetime | 亲和类型为NUMERIC,无专门存储类,可存储为TEXT(日期时间字符串)、REAL(Julian天数)或INTEGER(Unix时间戳);插入时按NUMERIC规则转换 | 为TEXT时按数据库编码存储;为REAL时按8字节IEEE浮点存储;为INTEGER时按动态字节存储 | 若为TEXT:符合"YYYY-MM-DD HH:MM:SS.SSS"格式字符串;若为REAL:±1.7×10⁻³⁰⁸到±1.7×10³⁰⁸;若为INTEGER:-9223372036854775808到9223372036854775807 | "2023-10-01 15:30:45.123"(TEXT)、2459876.6463(REAL,Julian天数)、1696107045(INTEGER,Unix时间戳) |
INTEGER类型:带符号的整数
- 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
- 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。
字段名称 | 详细说明 | 存储方式 | 取值范围 | 示例值 |
---|---|---|---|---|
INT 小写int | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数(如CAST("3.0" AS INTEGER)→3);类型名称不限制存储长度,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 2147483647(4字节最大值)、-128(1字节最小值) |
INTEGER 小写integer | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 9223372036854775807(8字节最大值)、32767(2字节最大值) |
TINYINT 小写tinyint | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度(非固定1字节),仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 127(1字节最大值)、-128(1字节最小值) |
SMALLINT 小写smallint | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度(非固定2字节),仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 32767(2字节最大值)、-32768(2字节最小值) |
MEDIUMINT 小写mediumint | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 8388607(3字节最大值)、-8388608(3字节最小值) |
BIGINT 小写bigint | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度(非固定8字节),仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 9223372036854775807(8字节最大值)、-9223372036854775808(8字节最小值) |
UNSIGNED BIG INT 小写unsigned big int | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;名称中"UNSIGNED"不限制无符号,实际可存储带符号整数,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 4294967295(4字节无符号最大值,实际以带符号存储)、0 |
INT2 小写int2 | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 32767(2字节最大值)、-32768(2字节最小值) |
INT8 小写int8 | 亲和类型为INTEGER,规则同NUMERIC,仅CAST表达式处理时更倾向整数;类型名称不限制存储长度,仅影响亲和性 | 以INTEGER存储,按值大小动态使用1、2、3、4、6或8字节(二进制补码,小端序) | 1字节:-128到127;2字节:-32768到32767;3字节:-8388608到8388607;4字节:-2147483648到2147483647;6字节:-281474976710656到281474976710655;8字节:-9223372036854775808到9223372036854775807 | 9223372036854775807(8字节最大值)、-9223372036854775808(8字节最小值) |
REAL类型:浮点值
- 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
- 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。
字段名称 | 详细说明 | 存储方式 | 取值范围 | 示例值 |
---|---|---|---|---|
REAL 小写real | 亲和类型为REAL,数据插入时优先转换为REAL类型;文本可转为浮点数时自动转换(如"3"→3.0),但"30000.0"不会转为INTEGER(区别于NUMERIC) | 以8字节IEEE 754双精度浮点格式存储(二进制,含符号位、指数位、尾数位) | ±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸(精度约15-17位小数) | 3.14159、-0.00001(1e-5)、1.23e20 |
DOUBLE 小写double | 亲和类型为REAL,数据插入时优先转换为REAL类型;文本可转为浮点数时自动转换,"30000.0"不会转为INTEGER | 以8字节IEEE 754双精度浮点格式存储 | ±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸ | 2.71828(自然常数e)、-1.618e0(黄金比例) |
DOUBLE PRECISION 小写double precision | 亲和类型为REAL,数据插入时优先转换为REAL类型;文本可转为浮点数时自动转换,"30000.0"不会转为INTEGER | 以8字节IEEE 754双精度浮点格式存储 | ±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸ | 6.022e23(阿伏伽德罗常数)、-3.14e-10 |
FLOAT 小写float | 亲和类型为REAL,数据插入时优先转换为REAL类型;文本可转为浮点数时自动转换,"30000.0"不会转为INTEGER | 以8字节IEEE 754双精度浮点格式存储 | ±1.7×10⁻³⁰⁸ 到 ±1.7×10³⁰⁸ | 9.8(重力加速度)、1.0e308(接近最大值) |
NONE类型
- 不做任何的转换,直接以该数据所属的数据类型进行存储。
BLOB
- 值是一个 blob 数据,完全根据它的输入存储。
字段名称 | 详细说明 | 存储方式 | 取值范围 | 示例值 |
---|---|---|---|---|
BLOB 小写blob | 亲和类型为NONE,数据插入时不进行任何转换,直接以原始二进制数据存储;适合存储图片、文件片段等二进制内容 | BLOB 数据以二进制形式存储,无需显式长度前缀,但 SQLite 内部记录长度信息。 原样存储输入的二进制数据,带长度前缀标识数据字节数 | 无严格长度限制(受数据库文件大小限制),支持任意二进制数据 | X'0102FF'(十六进制表示的二进制数据)、X'48656C6C6F'(对应"Hello"的二进制) |
NONE 亲和类型 、BLOB 字段名称 和 未指定类型字段定义方式 的关联与区别
1. NONE(亲和类型)
定义
- NONE 是 SQLite 的五种亲和类型之一,表示字段在插入数据时 不进行任何类型转换,直接保留原始数据的存储类(Storage Class)。
- 核心特性 :
- 插入的值以原始类型存储(如
TEXT
存为TEXT
,BLOB
存为BLOB
)。 - 唯一"不干预数据类型"的亲和类型 ,区别于
TEXT
(强制转文本)、NUMERIC
(优先转数值)等。
- 插入的值以原始类型存储(如
对应字段声明方式
- 两种情况触发 NONE 亲和类型 :
- 字段明确声明为
BLOB
(字段名称为BLOB
)。 - 字段未指定类型 (如
CREATE TABLE t (col);
中的col
)。
- 字段明确声明为
适用场景
- 严格保留原始数据格式 :
例如存储二进制文件(图片、音频)、加密数据、原始字节流等,避免 SQLite 隐式转换导致数据丢失或损坏。
2. BLOB(字段名称)
定义
- BLOB 是 SQLite 中专门用于存储二进制数据的字段名称,其亲和类型为
NONE
。 - 存储方式 :
- 原样存储输入的二进制数据,带长度前缀(标识二进制数据的字节数)。
- 不进行编码转换(如 UTF-8 编码),直接保留原始字节流。
取值范围
- 无严格长度限制:仅受数据库文件大小限制(默认最大 BLOB 大小为 1GB,可通过配置调整)。
- 支持任意二进制数据:如字节流、文件片段、十六进制数据等。
示例值
X'0102FF'
:十六进制表示的二进制数据(对应字节0x01
、0x02
、0xFF
)。X'48656C6C6F'
:字符串"Hello"
的原始二进制数据。- 图片的二进制字节流:如 PNG 格式的文件二进制数据。
3. 未指定类型(字段定义方式)
定义
- 未指定类型 是字段定义方式的一种,指创建表时字段未声明任何类型(如
CREATE TABLE t (id, name);
中的id
和name
)。 - 亲和类型 :自动推断为
NONE
,数据插入时 不进行类型转换,直接以原始存储类存储。
存储方式
- 根据输入数据的存储类决定 :
- 输入为
INTEGER
:存为INTEGER
。 - 输入为
TEXT
:存为TEXT
。 - 输入为
BLOB
:存为BLOB
。 - 输入为
REAL
:存为REAL
。
- 输入为
取值范围
- 取决于输入数据的存储类 :
INTEGER
:范围同 SQLite 的INTEGER
存储类(-128 到 9223372036854775807 等)。TEXT
:无严格长度限制,支持 Unicode。BLOB
:无严格长度限制,支持任意二进制数据。
示例值
123
:存储为INTEGER
。"未指定类型的文本"
:存储为TEXT
。X'ABCDEF'
:存储为BLOB
。3.14
:存储为REAL
。
三者关系总结
特性 | NONE(亲和类型) | BLOB(字段名称) | 未指定类型(字段定义方式) |
---|---|---|---|
核心规则 | 数据插入时 不进行任何类型转换,保留原始存储类。 | 亲和类型为 NONE ,用于存储二进制数据。 |
亲和类型为 NONE ,字段未声明类型,存储方式由输入数据决定。 |
字段声明方式 | 无直接字段名称,需通过字段定义方式(BLOB 或未指定类型)实现。 |
字段名称为 BLOB (显式声明)。 |
字段未声明类型(隐式定义)。 |
存储方式 | 原始数据直接存储,无编码或格式转换。 | 原样存储二进制数据,带长度前缀。 | 根据输入数据的存储类决定(INTEGER 、TEXT 、BLOB 、REAL 等)。 |
典型应用场景 | 存储混合类型数据、二进制文件等需严格保留原始格式的场景。 | 存储图片、音频、加密数据等二进制内容。 | 快速原型开发、临时表或日志表。 |
区别 | 是一种 亲和类型规则 ,适用于所有声明为 BLOB 或未指定类型的字段。 |
是 字段名称 ,显式声明为 BLOB ,专用于二进制数据。 |
是 字段定义方式,隐式未指定类型,存储方式由输入数据决定。 |
关键建议
-
显式声明字段类型:
- 对关键业务数据表,优先使用
BLOB
显式声明字段,避免依赖未指定类型导致的隐式推断问题。 - 例如:
CREATE TABLE files (content BLOB);
。
- 对关键业务数据表,优先使用
-
BLOB 处理注意事项:
- 插入 BLOB 数据时,使用参数化查询或二进制流操作,避免手动处理导致数据损坏。
- 检索 BLOB 数据时,直接读取二进制字节流,无需解码。
-
避免未指定类型的滥用:
- 未指定类型字段可能导致后续插入数据类型不一致(如先插入
TEXT
,后插入INTEGER
),影响数据完整性。 - 对需要严格类型约束的字段,显式声明类型(如
TEXT
、INTEGER
)。
- 未指定类型字段可能导致后续插入数据类型不一致(如先插入
示例代码(SQLite)
sql
-- 1. 使用 BLOB 字段存储二进制数据
CREATE TABLE images (
id INTEGER PRIMARY KEY,
image_data BLOB -- 亲和类型为 NONE,存储二进制图片
);
-- 2. 未指定类型的字段(自动推断为 NONE)
CREATE TABLE logs (
id INTEGER,
message -- 亲和类型为 NONE,存储原始数据
);
-- 3. 插入混合类型数据
INSERT INTO logs (id, message) VALUES
(1, 'Error: File not found'), -- 存储为 TEXT
(2, 12345), -- 存储为 INTEGER
(3, X'010203'); -- 存储为 BLOB
通过上述整合,可清晰理解 NONE 亲和类型 、BLOB 字段名称 和 未指定类型字段定义方式 的关联与区别,确保在实际应用中正确选择数据类型,避免隐式转换带来的问题。