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?3?? 到 ±1.7×103??(精度約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?3?? 到 ±1.7×103??),可覆蓋極廣時間范圍。 |
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?3??到±1.7×103??;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?3??到±1.7×103??;若為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?3??到±1.7×103??;若為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?3?? 到 ±1.7×103??(精度約15-17位小數) | 3.14159、-0.00001(1e-5)、1.23e20 |
DOUBLE 小寫double | 親和類型為REAL,數據插入時優先轉換為REAL類型;文本可轉為浮點數時自動轉換,"30000.0"不會轉為INTEGER | 以8字節IEEE 754雙精度浮點格式存儲 | ±1.7×10?3?? 到 ±1.7×103?? | 2.71828(自然常數e)、-1.618e0(黃金比例) |
DOUBLE PRECISION 小寫double precision | 親和類型為REAL,數據插入時優先轉換為REAL類型;文本可轉為浮點數時自動轉換,"30000.0"不會轉為INTEGER | 以8字節IEEE 754雙精度浮點格式存儲 | ±1.7×10?3?? 到 ±1.7×103?? | 6.022e23(阿伏伽德羅常數)、-3.14e-10 |
FLOAT 小寫float | 親和類型為REAL,數據插入時優先轉換為REAL類型;文本可轉為浮點數時自動轉換,"30000.0"不會轉為INTEGER | 以8字節IEEE 754雙精度浮點格式存儲 | ±1.7×10?3?? 到 ±1.7×103?? | 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)
-- 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 字段名稱 和 未指定類型字段定義方式 的關聯與區別,確保在實際應用中正確選擇數據類型,避免隱式轉換帶來的問題。
參考
- SQLite 數據類型-菜鳥教程
- Datatypes In SQLite Version 3
- Datatypes In SQLite Version 2