BOOLEAN或TINYINT混乱


91

我正在为一个站点设计一个数据库,在该站点中我需要使用布尔日期类型来仅存储2个状态,即true或false。我正在使用MySQL。
在使用phpMyAdmin设计数据库时,我发现我同时拥有BOOLEAN数据类型和TINYINT数据类型。
我浏览了不同的文章,有人说TINYINT与BOOLEAN相同,没有区别。有人说BOOLEAN在MySQL中转换为TINYINT。

我的问题是,如果两者相同,为什么会有两个?应该只有其中之一。

这是我阅读的文章的参考:
http : //www.careerride.com/MySQL-BOOL-TINYINT-BIT.aspx
http://dev.mysql.com/doc/refman/5.5/en/numeric-type -overview.html

Answers:


137

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 2012年

5
是的,您可以知道拥有BIT(1)BIT(17)BIT(64)
–ypercubeᵀᴹ2012年

3
@Devart-您的答案得票最多并首先出现(无论如何在我的列表中)并且已经过去了一段时间,您是否有可能愿意在答案中添加一些关于MySQL 5.1和BIT类型的讨论。后来?
乔纳森

3
@Jonathan也许提到它很有价值,但是BIT(1)实际上使用的空间不会少于TINYINT(1),并且不会像大多数人在使用标准mysql控制台时所期望的那样显示。由于这种缺点,并且没有存储优势,因此,以我的经验来看,仅使用TINYINT(1)或BOOLEAN似乎是最常见的方法。
泰勒·史密斯

31

只是为php开发人员提供的注释(我缺少必要的stackoverflow点以将其发布为注释)...自动转换为TINYINT的自动(无提示)意味着php从“ BOOLEAN”列中检索值为“ 0”或“ 1”,不是预期的(对我而言)是/否。

正在查看用于创建表的SQL的开发人员会看到类似“ some_boolean BOOLEAN NOT NULL DEFAULT FALSE”的内容,当检索包含该列的行时,可能会期望看到true / false结果。相反(至少在我的PHP版本中),结果将是“ 0”或“ 1”(是的,字符串“ 0”或字符串“ 1”,不是int 0/1,谢谢php)。

这是一个巧合,但足以导致单元测试失败。


2
另外需要注意的是,PHP的mysql驱动程序将所有整数类型都提取为字符串。
kojow7

24

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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.