🗄️ 第四章 管理数据-避免非法数据的功能
📄 一句话概括

BOOLEAN 只有两个值:TRUE 和 FALSE——真/假、是/否、开/关。它是最简单的类型,却也是最容易被忘记「其实底层是数字」的类型:TRUE 就是 1,FALSE 就是 0。

📝 本节和前面几节的关系

类型家族的最后一族:前四节管了数字、文字、日期,本节管「只有两种状态」的量。会员是否有效、订单是否已付、任务是否完成——世界上一大半属性其实只有两种答案,BOOLEAN 就是为它们准备的。

一、定义与用法

CREATE TABLE members (
    id      INT,
    name    VARCHAR(20),
    active  BOOLEAN      -- 会员是否有效
);

INSERT INTO members VALUES (1, '张三', TRUE);
INSERT INTO members VALUES (2, '李四', FALSE);

二、真相:底层是数字

在 MySQL 里 BOOLEAN 就是 TINYINT(1) 的别名:

SQLite 里更直接:建表写 BOOLEAN,存进去的就是整数 1/0。所以别被名字骗了——它是个「只有两个合法值」的整数。

三、什么时候用 BOOLEAN

场景 列名习惯
会员是否启用 is_active
订单是否已支付 is_paid
文章是否删除(软删除标记) is_deleted

列名带 is_ 前缀是通行习惯,一眼就知道这列只有真/假。

四、动手 Demo:真假当数字用

CREATE TABLE t (
    name VARCHAR(20),
    ok   BOOLEAN
);

INSERT INTO t VALUES ('甲', TRUE), ('乙', FALSE), ('丙', TRUE);

-- 1. 直接查询
SELECT * FROM t WHERE ok = TRUE;

-- 2. 等价的数字写法
SELECT * FROM t WHERE ok = 1;

-- 3. 统计有多少人 TRUE
SELECT COUNT(*) FROM t WHERE ok = TRUE;

三种写法结果一致(第 1、3 条都命中甲和丙,计数 2)。

五、30 秒实验

把 TRUE 换成 2 塞进 BOOLEAN 列再查——多数数据库照样收(它本质是 TINYINT)。这提醒我们:BOOLEAN 的「只有两值」要靠约束保证,光靠类型拦不住 2、3、4(严格说这是 BOOLEAN 的软肋,引出下一节起约束的必要性)。

六、常见误区

自测三问 1. TRUE 和 FALSE 底层是什么?(1 和 0) 2. 列名为什么要带 is_ 前缀?(一眼看出只有真/假两种状态) 3. 只靠 BOOLEAN 类型能保证列里只有 0/1 吗?(不能,塞 2 也收——要靠约束)

相关笔记