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
类型,因为它只能是 0
或1
.
【讨论】:
【参考方案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 混淆的主要内容,如果未能解决你的问题,请参考以下文章