在 MySQL 中布尔值的布尔值与 tinyint (1)的比较

在 MySQL 数据库中,哪种列类型最适合用于布尔值?我使用 boolean,但我的同事使用 tinyint(1)

134507 次浏览

这些数据类型是同义词。

在 MySQL 中,boolean不是一种独特的数据类型; 它只是 tinyint.请参阅 MySQL 手册中的这一页的同义词。 请参阅下面 dev.mysql.com/doc/中的引号和示例

BOOL,BOOLEAN 这些类型是 TINYINT (1)的同义词。值为零 非零值被认为为真:

    mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

然而,值 TRUE 和 FALSE 分别只是1和0的别名,如下所示:

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+
mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+
mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+
mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+

最后两个语句显示所示的结果,因为2等于 不是1也不是0。

就我个人而言,我建议使用 tinyint 作为首选项,因为布尔值并不像您认为的那样从名称中进行操作,所以它可能会导致潜在的误导性代码。但在实际层面上,这真的没有关系-,它们都做同样的事情,所以你不会得到或失去任何东西,使用任何一个。

使用 枚举是最容易和最快的

我不推荐使用 enum 或 tinyint (1) ,因为 bit (1)只需要1位来存储布尔值,而 tinyint (1)需要8位。

裁判

对于 MySQL 中的布尔值,TINYINT vs ENUM (0,1)

我将在这里采用一种不同的方法,并建议您的开发人员同事理解您的代码和编译器/数据库理解您的代码一样重要。使用 boolean可能做同样的事情使用 tinyint,但它有优势的 语义上的传达你的 意图是什么,这是值得的东西。

如果您使用 tinyint,那么您应该看到的唯一值是 01,这一点并不明显。
boolean总是 truefalse

我使用 衣冠楚楚连接到 MySQL的经验是 这很重要。我使用以下脚本将一个非空位(1)改为可空 tinyint (1) :

ALTER TABLE TableName MODIFY Setting BOOLEAN null;

然后 Dapper 开始抛出例外。我试着看看剧本之前和之后的区别。注意到位(1)变成了 tinyint (1)。

然后我跑过去:

ALTER TABLE TableName CHANGE COLUMN Setting Setting BIT(1) NULL DEFAULT NULL;

这样问题就解决了。

虽然 booltinyint(1)确实是 功能上相同的,但是 bool应该是首选,因为它承载了您正在尝试做的事情的语义含义。此外,许多 ORM 会将 bool转换为编程语言的本机布尔类型。

无论什么时候选择 int 或 bool,特别是当可空列出现时,这一点非常重要。

想象一个有多张照片的产品。你怎么知道哪张照片可以作为产品封面?我们会用一列来表示。

到目前为止,product_image表有两列: product_idis_cover

好吗?还没有。由于产品只能有一个封面,我们需要在这两列上添加一个惟一的索引。

但是等等,如果这两个列将得到一个唯一的索引,你将如何存储同一产品的许多非封面图像?唯一索引将在这里抛出一个错误。

所以你可能会想“好的,但是你可以使用 NULL 值,因为这些值被唯一的索引检查省略了”,是的,这是真的,但是我们在这里失去了语言规则。

在布尔类型列中使用 NULL 值的目的是什么?是“全部”,“任何”还是“不”?布尔值列中的 null 值允许我们使用唯一索引,但它也搞乱了我们解释记录的方式。

我要说的是,在某些情况下,整数可以发挥更好的作用,因为它不必严格遵循真或假的含义