域名 AXUM.RS 将于 2025 年 10 月到期。我们无意再对其进行续费,如果你有意接续这个域名,请与我们取得联系。
  • AXUM.RS 现仅需人民币 3000 元(大写:叁仟元整。接受适度议价
  • 按照行业规则,AXUM.RS 到期后,大概率会进入长时间的赎回期,该期间内,如果你想拥有该域名,将要付出高额的费用
  • 我们已启用 AXUM.EU.ORG 域名,并将持续运营
  • 仅接受微信或支付宝交易
如果你对 AXUM.RS 有兴趣,请和我们进行联系:

MySQL实现BOOLEAN

MySQL 哪怕到了 8.x 版本,也没有内置 bool 类型(PostgreSQL 一开始就提供了boolean类型),在日常开发中,如何表达 bool 值呢?

TINYINT

使用 TINYINT 表示 bool 值,在 MySQL 界应该是应用最广泛的方法:

CREATE TABLE tmp_bool1(
    is_del TINYINT NOT NULL DEFAULT 0 COMMENT '0:FALSE;1:TRUE'
);

当然,除了 TINYINT,你可以用包括 INTBIGINT 甚至 DECIMAL 在内的任何整数类型来表达——只要你不心疼你的系统资源,因为它的思想很简单,像 C 语言那样:

其实,在 MySQL 内部也是使用 01 判断是否成立:

SELECT 1 > 0;
/*
+-------+
| 1 > 0 |
+-------+
|     1 |
+-------+
*/

TINYINT 的存储空间是 1 字节

TINYINT 的存储空间是 1 字节

当然,除了“不人道”的 01,使用 CHAR(1)可以提供更为“人道”的实现——当然,你也可以用CHAR(1024)VARCHAR(1024),甚至 TEXT 来表示,只要你不心疼资源:

CREATE TABLE tmp_bool2(
    is_del CHAR(1) NOT NULL DEFAULT 'F' COMMENT 'F:FALSE;T:TRUE'
);

和使用整数表示相比,至少 CHAR(1) 不再是一眼瞎的 01 了,而是更具词面意义的字母。其实,你完全可以改成汉字:

CREATE TABLE tmp_bool2(
    is_del CHAR(1) NOT NULL DEFAULT '假' COMMENT '假:FALSE;真:TRUE'
);

CHAR(1) 的存储空间是 1 字节

CHAR(1) 的存储空间是 1 字节

ENUM

  • 对于 TINYINT:如果输入的数据不是 01 呢,比如:100,或者 -1——是的,你可以向 C 语言那样,非 0TRUE
  • 对于 CHAR(1):如果输入的数据不是 F/T假/真呢,比如:A——是的,你可以向 C 语言学习,比如非 F 或非 TRUE

这些都是业务逻辑上控制的,你知道的,在 Rust (或其它像 Go 这种现代语言)中,bool 只能是 false/true,不可能出现第 3 个值。其实,MySQL 的Enum是可以达到这个效果的:

CREATE TABLE tmp_bool3(
    is_del ENUM('FALSE','TRUE') NOT NULL DEFAULT 'FALSE'
);

当你试图插入 FALSE/TRUE (不区分大小写,可以用对应的数字替代)之外的数据时,MySQL 将报错。不错,至少实现了编程语言中的 bool 所要的特性。而且,因为支持使用对应的数字(按 ENUM(元素列表)的定义顺序),也符合 C 语言的特性和 MySQL 的判断成功与否的默认行为。

注意,ENUM 的存储空间不是固定的:

  • 当 ENUM 类型包含 1 ~ 255 个成员时,需要 1 个字节的存储空间;

  • 当 ENUM 类型包含 256 ~ 65535 个成员时,需要 2 个字节的存储空间。

  • ENUM 类型的成员个数的上限为 65535 个。

当 ENUM 类型包含 1 ~ 255 个成员时,需要 1 个字节的存储空间;

当 ENUM 类型包含 256 ~ 65535 个成员时,需要 2 个字节的存储空间。

ENUM 类型的成员个数的上限为 65535 个。

本例中,ENUM('FALSE','TRUE') 的存储空间是 1 字节

本例中,ENUM('FALSE','TRUE') 的存储空间是 1 字节

BIT

如果你学计算机基础的时候不是太躺平,应该知道,字节(byte)位(bit) 的关系。

MySQL 提供了 BIT 数据类型:

BIT(1) 占用的存储空间是 1 位。注意,是 1 bit,也就是以上其它三种的 1/8

对于 bool 来说,1 bit 已经足矣,它能存储 01 两个状态。

要查看完整内容,请先登录