首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQLite 沒有布林型別?實測揭秘 0、1 與 NULL 的三態邏輯

     編輯:關於SqlServer

在 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)
  • 整數、長整數、浮點數等數值型 → 非零即 1
  • 標準布林值 → 報錯(SQLite 不支援)
  • NULL → 保持 NULL

避坑指南: 查詢時請務必使用 flag = 1 或 flag IS NULL,切勿寫成 flag = 'true',否則會因型別轉換導致查不到資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved