99

我正在为一个需要使用布尔日期类型来仅存储真或假两种状态的站点设计数据库。我正在使用 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

4

5 回答 5

143

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

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

尝试创建此表 -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

然后运行 ​​SHOW CREATE TABLE,你会得到这个输出 -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
于 2012-06-23T07:49:54.867 回答
33

只是给 php 开发人员的注意事项(我缺少必要的 stackoverflow 点来将其作为评论发布)...... 到 TINYINT 的自动(和静默)转换意味着 php 从“BOOLEAN”列中检索一个值作为“0”或“1”,而不是预期的(由我)真/假。

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

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

于 2014-12-04T21:29:13.133 回答
24

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

于 2013-06-25T13:33:42.447 回答
7

自 MySql 5.1 版本参考

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

==================================================== ========================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

于 2014-10-27T12:31:40.950 回答
4

MySQL 状态的数字类型概述:BOOL、BOOLEAN:这些类型是 TINYINT(1) 的同义词。零值被认为是错误的。非零值被认为是真的。

见这里: https ://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

于 2018-01-11T11:18:01.290 回答