MySQL TINYINT(1) 到 BOOL

Posted

技术标签:

【中文标题】MySQL TINYINT(1) 到 BOOL【英文标题】:MySQL TINYINT(1) to BOOL 【发布时间】:2013-08-09 08:43:21 【问题描述】:

列的数据类型上的参数究竟有什么作用?本质上:

我尝试了 TINYINT(1),它似乎只包含 1 或 0。为什么它不显示/存储至少 0-9?


编辑:事实证明,这个问题不是 mysql 问题,而是 Cakephp 出乎意料的行为。详细阅读我的答案。我将原始问题保留在下面,因此有用的答案仍然有意义。


我做了什么:

我使用命令创建了一个 MySQL 表

CREATE TABLE table_name (
    ... irrelevant columns
    transaction_type TINYINT(1) NOT NULL COMMENT 'identifier from 0-5 (for now)'
);

很快就彻底糊涂了,因为我无法在 transaction_type 列中存储除 0 和 1 之外的值。

经过一番研究,我相当自信地确定TINYINT(或任何其他整数数据类型)的参数只不过是字符的显示宽度。我理解这意味着两件事:

它应该仍然存储整个插入的值,只要它在 TINYINT 的范围内 它只会显示一个字符,所以当我从表格中选择时,我应该能够看到值 0-9。

我认为这些假设中至少有一个(或者我对参数的整体理解)一定是错误的,因为每当我尝试在该列中插入一个大于 1 的值时,它都会显示 1。

然后我尝试了:

ALTER TABLE table_name CHANGE transaction_type transaction_type TINYINT;

我突然能够插入我想要的任何值。然而,即使上面的命令改变了整个表,之前插入的值仍然是 1,让我怀疑它们真的存储为 1。

我误解了显示宽度,还是我完全做错了什么?

除此之外:如果我不关心整数列在表中的外观,是否有任何理由为整数列提供参数?即 INT(11) 是否比 INT 更好?

一个可能对我更有帮助的类似问题: MySql: Tinyint (2) vs tinyint(1) - what is the difference?

我能找到解释显示宽度的最清晰来源:http://matt.thomm.es/archive/2006/11/28/mysql-integer-columns-and-display-width

【问题讨论】:

【参考方案1】:

简而言之:如果在列上启用了ZEROFILL,这仅取决于整数填充多少。


更长的解释:

SQL 中整数的长度不会改变它所持有的数字(TINYINT 将持有 -128 到 127,但无符号 TINYINT 将持有 0-255 等,无论长度如何。)

我真的很喜欢 MySQL Cheat Sheet 来检查尺寸。

现在 - INTINT(3) 之间的实际区别是什么?这很简单。如果启用ZEROFILL,整数将被零填充到此长度。这是唯一的区别。

有一篇很好的文章解释了这个here。

具体来说,是从article 复制而来的(检查一下!让他获得一些页面浏览量!)

mysql> select * from b;  
+-------+ | b     |  
+-------+ | 10000 |  
+-------+ 1 row in set (0.00 sec)      

mysql> alter table b change b b int(11) zerofill; 
Query OK, 1 row   affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0      

mysql> select * from b;  
+-------------+ | b           |  
+-------------+ | 00000010000 |  
+-------------+ 1 row in set (0.00 sec) 

【讨论】:

非常有帮助——但你能想到任何理由让它只存储 0 或 1 吗?我想 zerofill 不会改变这种行为 +1 获得超级有用的链接,但我认为您并没有完全回答我的问题【参考方案2】:

事实证明,CakePHP 假定 TINYINT(1) 应该是布尔类型,因为 MySQL 将 BOOL 别名为 TINYINT(1)。因此,任何“真”值(如大于一的值)都被赋值为 1,而任何“假”值都被赋值为零。

对疲惫的旅行者的警告:使用 TINYINT(1) 时,CakePHP 可能会在没有警告的情况下更改您的值。

老的 CakePHP 错误 here

【讨论】:

【参考方案3】:

TINYINT 后面括号中的数字仅用于显示目的 - 它与 MySQL 用于在该字段中存储值的字节数无关,与该字段中的值范围无关。括号中的数字仅用于指定当您使用 MySQL 的客户端运行查询时,该字段将显示多少位。

【讨论】:

以上是关于MySQL TINYINT(1) 到 BOOL的主要内容,如果未能解决你的问题,请参考以下文章

mysql中bigintintmediumintsmallint 和 tinyint的取值范围

mysql中bigintintmediumintsmallint 和 tinyint的取值范围

mysql中bigintintmediumintsmallint 和 tinyint的取值范围

MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

mysql中intbigintsmallint 和 tinyint的区别

mysql bigint ,int , smallint,tinyint 的范围