BOOLEAN或TINYINT混淆

104
我正在为一个网站设计数据库,需要使用 boolean 数据类型来存储仅有两种状态的数据,即 truefalse。我正在使用 MySQL
在使用 phpMyAdmin 设计数据库时,我发现我有 BOOLEAN 数据类型和 TINYINT 数据类型两个选项。我阅读了不同的文章,有些说 TINYINTBOOLEAN 相同,没有区别。有些则认为 MySQL 中的 BOOLEAN 被转换为 TINYINT
我的问题是,如果它们都相同,为什么会存在两者?应该只有其中之一。
以下是我阅读的文章参考链接:
5个回答

147

MySQL没有内置的布尔数据类型。它使用最小的整数数据类型-TINYINT。

BOOLEAN和BOOL是TINYINT(1)的同义词,因为它们是等效的。

尝试创建这个表 -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

然后运行 SHOW CREATE TABLE 命令,您将获得以下输出 -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)

1
但是您的答案在其他方面都是正确的。使 OP 困惑的似乎是同义词的存在。 - ypercubeᵀᴹ
2
似乎这是为了向后兼容而完成的。BOOLEAN数据类型在MySQL 5之前不存在,也没有经过优化的BIT类型,它也是TINYINT。从文档中可以看到 - 计划为5.1版本添加新功能:优化BIT类型以占用一个位(BIT现在占用一个字节;它被视为TINYINT的同义词)。 - Devart
6
是的,现在您可以拥有 BIT(1)BIT(17) 或者甚至是 BIT(64) - ypercubeᵀᴹ
3
@Devart -- 如果您的答案获得最多票数并首先出现(至少在我的列表中),并且时间过去了一段时间,那么有没有可能您愿意补充一下关于 MySQL 5.1 及更高版本中 BIT 类型的讨论? - Jonathan
3
@Jonathan 或许提及这个是有价值的,然而 BIT(1) 实际上并没有比 TINYINT(1) 更节省空间,并且在使用标准的 MySQL 控制台时也不能像大多数人预期的那样显示。因此,由于这个缺点和没有存储优势,根据我的经验,只使用 TINYINT(1) 或 BOOLEAN 似乎是最常见的选择。 - Tyler Smith
显示剩余2条评论

34

对于php开发人员的一条提示(我没有足够的stackoverflow点数将其发布为评论)……自动(且悄无声息)转换为TINYINT意味着php从“BOOLEAN”列中检索值时会得到“0”或“1”,而不是我所期望的true/false。

一个查看创建表所使用的SQL语句的开发人员,看到类似于:“some_boolean BOOLEAN NOT NULL DEFAULT FALSE,” 可能会合理地期望在检索包含该列的行时看到true/false结果。但实际上(至少在我的PHP版本中),结果将是“0”或“1”(是的,“0”字符串或“1”字符串,而不是int 0/1,感谢php)。

这只是小问题,但足以导致单元测试失败。


5
额外提示:PHP的mysql驱动程序将所有整数类型作为字符串提取。 - kojow7

24

最新的MySQL版本有一个新的BIT数据类型,您可以在该字段中指定位数,例如BIT(1)用作Boolean类型,因为它只能是01


7

1
你的参考资料指出所需的存储实际上是“大约(M+7)/8字节”。即,它会向上舍入到下一个完整的字节。因此,它不需要1位。 - mpen

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接