Zion中布尔字段语义取决于底层数据库:PostgreSQL严格限定为TRUE/FALSE/NULL;MySQL实为TINYINT(1),0为FALSE、非0为TRUE;SQLite无原生布尔,推荐用0/1整数写入并由应用层转换。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在函子Zion中定义布尔字段时,必须明确其底层依赖的数据库类型,因为Zion本身不定义存储语义,而是将字段映射到底层数据源(如 PostgreSQL、MySQL 或 SQLite);若未指定具体环境,默认按 PostgreSQL 语义处理——此时【布尔字段只能存 TRUE、FALSE 或 NULL】,不允许写入 1、0、't'、'f' 等等非标准字面量,否则插入失败或触发隐式转换陷阱。
PostgreSQL 环境下布尔字段的合法值
PostgreSQL 提供原生 BOOLEAN 类型,语义严格:
第一步:建表时直接使用 BOOLEAN 关键字,例如:is_published BOOLEAN;
第二步:插入必须用标准布尔字面量——INSERT INTO blog (is_published) VALUES (TRUE), (FALSE), (NULL);
第三步:查询时不能用 = 1 或 = 't',而应写 WHERE is_published IS TRUE 或 WHERE NOT is_published;【用 = TRUE 而非 = 1,否则在某些 ORM 或视图场景下可能因类型推导失败而返回空结果】。
MySQL 环境下布尔字段的实际行为
MySQL 没有真实布尔类型,BOOL 和 BOOLEAN 都是 TINYINT(1) 的别名:
方法一:接受任意整数输入,0 视为 FALSE,非 0(含 -5、2、100)均被判定为 TRUE;
方法二:若业务强约束“仅允许 0/1”,必须显式加 CHECK:is_archived TINYINT(1) CHECK (is_archived IN (0,1));
注意:不加 CHECK 时,UPDATE post SET is_archived = 99 语法完全合法,但后续 WHERE is_archived 仍会返回该行——这极易引发逻辑错误。
SQLite 环境下的宽松兼容策略
SQLite 动态类型系统不强制列类型,但约定俗成用整数模拟布尔:
写入 0 / 1 是安全且可预期的;
写入 'true'、'false'、'yes'、'no' 会被部分驱动转为 1/0,但【不是 SQLite 内核行为,而是驱动层解析,跨驱动结果不可靠】;
因此在 Zion 中若目标为 SQLite,应始终以整数 0/1 写入,并在应用层做显式布尔转换。











