在 SQLite 資料庫中,並不存在獨立的 Boolean 儲存類別。布林值實際上是以整數 0(false)和 1(true)的形式儲存。但在實際開發踩坑後發現,它其實呈現出「三態」特性:0、1 與 NULL。

為了驗證這一點,我設計了一系列插入測試,發現 SQLite 對輸入值的容錯率極高,幾乎「來者不拒」:
insert into stu (name,flag) values ('a1','true'); -- 存入 0
insert into stu (name,flag) values ('a2','ture'); -- 拼寫錯誤,存入 0
insert into stu (name,flag) values ('a3',1); -- 存入 1
insert into stu (name,flag) values ('a4','null'); -- 字串 'null',存入 0
insert into stu (name,flag) values ('a5','1'); -- 字串 '1',存入 1
insert into stu (name,flag) values ('a6',null); -- 真正的 NULL,保持 NULL
insert into stu (name,flag) values ('a7','2'); -- 非 0/1 數字字串,存入 1
insert into stu (name,flag) values ('a8',15); -- 整數 15,存入 1
insert into stu (name,flag) values ('a9',"數據庫"); -- 任意字串,存入 0
匯出資料庫後發現,所有語句均被轉換為標準整數形式:
insert into [stu] values('a1', 0);
insert into [stu] values('a2', 0);
insert into [stu] values('a3', 1);
insert into [stu] values('a4', 0);
insert into [stu] values('a5', 1);
insert into [stu] values('a6', null);
insert into [stu] values('a7', 1);
insert into [stu] values('a8', 1);
insert into [stu] values('string', 0);
SQLite 採用字元型儲存、整數型運算的隱性轉換機制:
1 (true)0 (false)1NULL → 保持 NULL避坑指南: 查詢時請務必使用 flag = 1 或 flag IS NULL,切勿寫成 flag = 'true',否則會因型別轉換導致查不到資料。