MySQL布尔类型的"tinyint(1)"可以存储值最大为127?

40

我想为商品库存创建一个真/假字段。

我希望将其设置为布尔值(会被转换为tinyint(1)),1表示有库存,0表示无库存。

我从供应商那里获取数据源,所以我想:“如果他们传递了多少库存呢?”

所以我想知道,如果我插入一个大于1的数字会发生什么。 我假设它会默认为1。

令我惊讶的是,它允许我保留任何高达127的数字,超过这个数字则默认为127。

有人能解释一下原因吗?

4个回答

59

已签名的 TINYINT 数据类型可以存储介于-128和127之间的整数值。

然而,TINYINT(1) 不会改变它可以存储的最小或最大值。它只是表示在将该类型的值打印为输出时,只显示一个数字。


2
有没有不使用bit(1)的理由?虽然我注意到如果我尝试将其设置为>1,它会默认为0。 - fncomp
1
@JoshN:不太确定,但我找到了这个问题,或许可以帮到你。 - BoltClock
1
@John:不,值仍然按原样显示,但是MySQL也会在应用程序需要时发送显示长度。在PHP中,您可以使用mysql_field_len()获取显示长度,然后调用substr()或其他必要的内容来适当地显示值,以防止值溢出显示长度。 - BoltClock
3
您的问题是什么是“显示”?当我从数据库中选择数据,并且tinyint(1)的值为100时,实际上它仍然会显示为100。 - Dejell
1
@Dejel 像 BoltClock 提到的那样,括号中的 length 值作为元数据。它允许应用程序(在需要时)知道列字段的预期长度。 - Nikunj Madhogaria
显示剩余5条评论

9

tinyint数据类型利用1个字节的存储空间。使用1个字节可以存储256个整数值(-128到127)。如果定义为tinyint unsigned,则负值将被舍弃,因此可以存储0到255。


6
请参见这里,了解MySQL如何处理此问题。如果您使用的是MySQL > 5.0.5,可以使用BIT作为数据类型(在旧版本中,BIT将被解释为TINYINT(1))。但是,(1)部分只是显示宽度,而不是内部长度。

3
能否请您解释一下“显示宽度”和“内部长度”的区别?我对这个概念很新奇,我原先以为数据库中的内容就是被选择的内容。 - JD Isaacks
1
请求解释这个。 - MaXi32

1
CREATE TABLE foo_test(
col_1 TINYINT
, col_2 TINYINT(2) 
, col_3 TINYINT(3) 
, col_4 TINYINT(2) ZEROFILL
, col_5 TINYINT(3) ZEROFILL
);

INSERT INTO foo_test( col_1,col_2,col_3,col_4,col_5 )
SELECT 1, 1,1,1,1
UNION ALL
SELECT 10, 10,10,10,10
UNION ALL
SELECT 100, 100,100,100,100;

SELECT * FROM foo_test; 

**OUTPUT:-**   
 col_1   col_2   col_3   col_4   col_5  
------  ------  ------  ------  --------
     1       1       1      01       001
    10      10      10      10       010
   100     100     100     100       100

如果在创建表时使用了zerofill,MySQL将在开头显示0。如果没有使用zerofill,则无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接