BOOLEAN或TINYINT混乱

时间:2012-06-23 07:45:09

标签: mysql types boolean tinyint

我正在为一个网站设计一个数据库,我需要使用一个布尔日期类型来存储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

5 个答案:

答案 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类型,因为它可以仅限01

答案 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