我正在为一个网站设计一个数据库,我需要使用一个布尔日期类型来存储2个状态,无论是真还是假。我正在使用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
答案 0 :(得分:118)
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 :(得分:29)
只是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,谢谢你)。
这可能会导致单位测试失败。
答案 2 :(得分:23)
最新的MySQL版本具有新的BIT
数据类型,您可以在其中指定字段中的位数,例如BIT(1)
用作Boolean
类型,因为它可以仅限0
或1
。
答案 3 :(得分:6)
自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
答案 4 :(得分:0)
MySQL的数字类型概述: BOOL,BOOLEAN: 这些类型是TINYINT(1)的同义词。值为零被视为false。非零值被认为是真实的。
见这里: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html