Bip*_*thi 87 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
Dev*_*art 127
MySQL没有内部布尔数据类型.它使用最小的整数数据类型 - TINYINT.
BOOLEAN和BOOL是TINYINT(1)的等价物,因为它们是同义词.
尝试创建此表 -
CREATE TABLE table1 (
column1 BOOLEAN DEFAULT NULL
);
Run Code Online (Sandbox Code Playgroud)
然后运行SHOW CREATE TABLE,你会得到这个输出 -
CREATE TABLE `table1` (
`column1` tinyint(1) DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)
Tom*_*ugh 30
只是php开发者的一个注释(我没有必要的stackoverflow点来发布这个评论)...自动(和静默)转换为TINYINT意味着php从"BOOLEAN"列中检索一个值为"0"或"1",不是预期的(由我)真/假.
正在查看用于创建表的SQL并且看到类似"some_boolean BOOLEAN NOT NULL DEFAULT FALSE"的开发人员可能合理地期望在检索包含该列的行时看到真/假结果.相反(至少在我的PHP版本中),结果将是"0"或"1"(是的,字符串"0"或字符串"1",而不是int 0/1,谢谢你的PHP).
这是一个问题,但足以导致单元测试失败.
截至MySql 5.1版本参考
BIT(M) = approximately (M+7)/8 bytes,
BIT(1) = (1+7)/8 = 1 bytes (8 bits)
Run Code Online (Sandbox Code Playgroud)
================================================== =======================
TINYINT(1) take 8 bits.
Run Code Online (Sandbox Code Playgroud)
https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric
MySQL 的数字类型概述指出: BOOL、BOOLEAN:这些类型是 TINYINT(1) 的同义词。零值被视为错误。非零值被视为 true。
请参阅此处: https ://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html