BOOLEAN 或 TINYINT 混淆

Posted

技术标签:

【中文标题】BOOLEAN 或 TINYINT 混淆【英文标题】:BOOLEAN or TINYINT confusion 【发布时间】:2012-06-25 10:29:12 【问题描述】:

我正在为一个需要使用布尔日期类型来存储两种状态(真或假)的网站设计数据库。我正在使用 mysql。 在使用 phpMyAdmin 设计数据库时,我发现我同时拥有 BOOLEAN 数据类型和 TINYINT 数据类型。 我浏览了不同的文章,有人说 TINYINT 与 BOOLEAN 相同,没有区别。有人说 BOOLEAN 在 MySQL 中被转换为 TINYINT。

我的问题是,如果它们都相同,为什么存在两个?应该只有其中一个。

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

【问题讨论】:

【参考方案1】:

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

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

尝试创建这个表 -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

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

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

【讨论】:

但是你的答案在所有其他方面都是正确的。似乎使 OP 感到困惑的是同义词的存在。 似乎是为了向后兼容而做的。 BOOLEAN 数据类型在 MySQL 5 之前是未优化的 BIT 类型,它也是 TINYINT。来自文档 - 为 5.1 计划的新功能:优化 BIT 类型以占用一位。 (BIT 现在占用一个字节;它被视为 TINYINT 的同义词。)。 是的,你可以知道有BIT(1)BIT(17)甚至BIT(64) @Devart -- 您的答案得票最多并且出现在第一位(无论如何都在我的列表中)并且已经过去了一段时间,您是否愿意在答案中添加一些讨论MySQL 5.1 及更高版本上的 BIT 类型? @Jonathan 也许提到它很有价值,但是 BIT(1) 实际上并没有比 TINYINT(1) 使用更少的空间,并且在使用标准 mysql 控制台时不会像大多数人所期望的那样显示。由于这个缺点,并且没有存储优势,在我的经验中,仅使用 TINYINT(1) 或 BOOLEAN 似乎是最常见的。【参考方案2】:

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

【讨论】:

【参考方案3】:

截至MySql 5.1版本reference

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

【讨论】:

您的参考资料说所需的存储空间实际上是“大约 (M+7)/8 字节”。即,它向上舍入到下一个完整字节。因此它确实占用 1 位。【参考方案4】:

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

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

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

【讨论】:

作为附加说明,PHP 的 mysql 驱动程序将所有整数类型作为字符串拉入。【参考方案5】:

MySQL 的数值类型概述: 布尔值,布尔值: 这些类型是 TINYINT(1) 的同义词。零值被认为是错误的。非零值被认为是真的。

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

【讨论】:

以上是关于BOOLEAN 或 TINYINT 混淆的主要内容,如果未能解决你的问题,请参考以下文章

mybatis boolean和tinyint怎么转换

MySQL 转换为 TINYINT

mysql有布尔类型吗?

MySQL TINYINT(1) 到 BOOL

哪位高手来解决一下:java中short类型数据如何转换成boolean类型???

Mybatis tinyint自动转boolean