MySQL TINYINT(1)到BOOL

时间:2013-08-07 19:44:17

标签: mysql

列数据类型的参数究竟是做什么的?基本上:

我尝试了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

3 个答案:

答案 0 :(得分:3)

简而言之:只有在列上启用了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) 

答案 1 :(得分:3)

事实证明,CakePHP假定TINYINT(1)应该是一个布尔类型,因为MySQL将BOOL别名为TINYINT(1)。因此,任何" true"值(如大于一的值)被指定为1,任何" false"值为零。

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

旧CakePHP错误here

答案 2 :(得分:-1)

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