39

我想为某件商品是否有库存创建一个真/假字段。

我想将其设置为布尔值(转换为tinyint(1)),1 表示有货,0 表示没有库存。

我从供应商那里得到信息,所以我想,“如果他们通过了有多少库存怎么办?”

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

令我惊讶的是,它将允许我保存最多 127 的任何数字,超过默​​认值 127 的任何数字。

谁能解释为什么?

4

4 回答 4

58

有符号TINYINT数据类型可以存储 -128 到 127 之间的整数值。

但是,TINYINT(1)不会更改它可以存储的最小值或最大值。它只是说当该类型的值作为输出打印时只显示一位数字。

于 2010-12-09T18:22:05.113 回答
8

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

于 2010-12-09T18:32:31.400 回答
6

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

于 2010-12-09T18:39:06.413 回答
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那么它是无效的。

于 2018-06-19T06:37:37.470 回答