MySQL和PostgreSQL对比与选型
本章基于个人经验,对两款数据库产品的某些重要特性的差异进行对比,并对选型提供参考意见。使用 Rust 的 u32 让 PostgreSQL 实现 MySQL 的 INT UNSIGNED
在上一章我们讨论到 PostgreSQL 没有 UNSIGNED 的问题,本章我们试图通过 rust 的 u32 来映射 PostgreSQL 的 int。MySQL实现BOOLEAN
茴香豆有多少种写法?这是上学时,鲁迅借着孔乙己的手,告诉了我们答案。本章我们将讨论在 MySQL 实现 bool 有多少种方法。【实战】部署 MySQL 8 主从复制和读写分离
利用主从复制,可以实现 MySQL 的读写分离、热备份等。本章将带你实战 MySQL 的一主二从。
MySQL实现BOOLEAN
- 51387
- 2022-10-12 21:48:07
茴香豆有多少种写法?这是上学时,鲁迅借着孔乙己的手,告诉了我们答案。本章我们将讨论在 MySQL 实现 bool 有多少种方法。
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
,你可以用包括 INT
、BIGINT
甚至 DECIMAL
在内的任何整数类型来表达——只要你不心疼你的系统资源,因为它的思想很简单,像 C 语言那样:
0
为FALSE
1
为TRUE
(实际在 C 语言中是非0
即TURE
)
其实,在 MySQL 内部也是使用 0
和 1
判断是否成立:
SELECT 1 > 0;
/*
+-------+
| 1 > 0 |
+-------+
| 1 |
+-------+
*/
TINYINT
的存储空间是 1 字节
当然,除了“不人道”的 0
和 1
,使用 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)
不再是一眼瞎的 0
和 1
了,而是更具词面意义的字母。其实,你完全可以改成汉字:
CREATE TABLE tmp_bool2(
is_del CHAR(1) NOT NULL DEFAULT '假' COMMENT '假:FALSE;真:TRUE'
);
CHAR(1)
的存储空间是 1 字节
CHAR(1)
的存储空间是 1 字节
无论是上述的 TINYINT
还是 CHAR(1)
,它们都存在一个风险:
- 对于
TINYINT
:如果输入的数据不是0
或1
呢,比如:100
,或者-1
——是的,你可以向 C 语言那样,非0
即TRUE
- 对于
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 字节
如果你学计算机基础的时候不是太躺平,应该知道,字节(byte)
和 位(bit)
的关系。
MySQL 提供了 BIT
数据类型:
CREATE TABLE tmp_bool4(
is_del BIT(1) NOT NULL DEFAULT 0 COMMENT '0:False;1:True'
);
对于 bool 来说,1 bit 已经足矣,它能存储 0
和 1
两个状态。