SQLite 数据库字段类型-详细说明,数据类型详细说明。

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亿年)。

关键说明

  1. 存储类是数据的实际存储形式,亲和类型仅影响插入时的优先转换规则,不限制实际存储的类型(如INTEGER亲和性字段可存储TEXT)。
  2. 若需严格限制取值范围(如年龄0-120),需通过CHECK约束实现(如age INTEGER CHECK (age BETWEEN 0 AND 120))。
  3. 日期时间可通过内置函数转换(如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 存为 TEXTBLOB 存为 BLOB)。
    • 唯一"不干预数据类型"的亲和类型 ,区别于 TEXT(强制转文本)、NUMERIC(优先转数值)等。

对应字段声明方式

  • 两种情况触发 NONE 亲和类型
    1. 字段明确声明为 BLOB (字段名称为 BLOB)。
    2. 字段未指定类型 (如 CREATE TABLE t (col); 中的 col)。

适用场景

  • 严格保留原始数据格式
    例如存储二进制文件(图片、音频)、加密数据、原始字节流等,避免 SQLite 隐式转换导致数据丢失或损坏。

2. BLOB(字段名称)

定义

  • BLOB 是 SQLite 中专门用于存储二进制数据的字段名称,其亲和类型为 NONE
  • 存储方式
    • 原样存储输入的二进制数据,带长度前缀(标识二进制数据的字节数)。
    • 不进行编码转换(如 UTF-8 编码),直接保留原始字节流。

取值范围

  • 无严格长度限制:仅受数据库文件大小限制(默认最大 BLOB 大小为 1GB,可通过配置调整)。
  • 支持任意二进制数据:如字节流、文件片段、十六进制数据等。

示例值

  • X'0102FF':十六进制表示的二进制数据(对应字节 0x010x020xFF)。
  • X'48656C6C6F':字符串 "Hello" 的原始二进制数据。
  • 图片的二进制字节流:如 PNG 格式的文件二进制数据。

3. 未指定类型(字段定义方式)

定义

  • 未指定类型 是字段定义方式的一种,指创建表时字段未声明任何类型(如 CREATE TABLE t (id, name); 中的 idname)。
  • 亲和类型 :自动推断为 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(显式声明)。 字段未声明类型(隐式定义)。
存储方式 原始数据直接存储,无编码或格式转换。 原样存储二进制数据,带长度前缀。 根据输入数据的存储类决定(INTEGERTEXTBLOBREAL 等)。
典型应用场景 存储混合类型数据、二进制文件等需严格保留原始格式的场景。 存储图片、音频、加密数据等二进制内容。 快速原型开发、临时表或日志表。
区别 是一种 亲和类型规则 ,适用于所有声明为 BLOB 或未指定类型的字段。 字段名称 ,显式声明为 BLOB,专用于二进制数据。 字段定义方式,隐式未指定类型,存储方式由输入数据决定。

关键建议

  1. 显式声明字段类型

    • 对关键业务数据表,优先使用 BLOB 显式声明字段,避免依赖未指定类型导致的隐式推断问题。
    • 例如:CREATE TABLE files (content BLOB);
  2. BLOB 处理注意事项

    • 插入 BLOB 数据时,使用参数化查询或二进制流操作,避免手动处理导致数据损坏。
    • 检索 BLOB 数据时,直接读取二进制字节流,无需解码。
  3. 避免未指定类型的滥用

    • 未指定类型字段可能导致后续插入数据类型不一致(如先插入 TEXT,后插入 INTEGER),影响数据完整性。
    • 对需要严格类型约束的字段,显式声明类型(如 TEXTINTEGER)。

示例代码(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 字段名称未指定类型字段定义方式 的关联与区别,确保在实际应用中正确选择数据类型,避免隐式转换带来的问题。


参考