【发布时间】:2011-05-23 01:09:00
【问题描述】:
我想为某件商品是否有库存设置一个真/假字段。
我想将其设置为布尔值(转换为 tinyint(1)),1 表示有货,0 表示没有库存。
我从供应商那里获取信息,所以我想,“如果他们通过了有多少库存怎么办?”
所以我想知道如果我插入一个大于 1 的数字会发生什么。我以为它会默认为 1。
令我惊讶的是,它允许我保存不超过 127 的任何数字,超过默认值 127 的任何数字。
谁能解释一下原因?
【问题讨论】:
我想为某件商品是否有库存设置一个真/假字段。
我想将其设置为布尔值(转换为 tinyint(1)),1 表示有货,0 表示没有库存。
我从供应商那里获取信息,所以我想,“如果他们通过了有多少库存怎么办?”
所以我想知道如果我插入一个大于 1 的数字会发生什么。我以为它会默认为 1。
令我惊讶的是,它允许我保存不超过 127 的任何数字,超过默认值 127 的任何数字。
谁能解释一下原因?
【问题讨论】:
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 那么它是无效的。
【讨论】:
请参阅here 了解 MySQL 如何处理此问题。如果您使用 MySQL > 5.0.5,您可以使用 BIT 作为数据类型(在旧版本中,BIT 将被解释为 TINYINT(1)。但是,(1)-part 只是显示宽度,而不是内部长度.
【讨论】:
tinyint 数据类型使用 1 个字节的存储空间。使用 1 个字节(-128 到 127)可以存储 256 个可能的整数值。如果您定义为tinyint unsigned,则负值将被丢弃,因此可以存储(0 到 255)。
【讨论】:
有符号的TINYINT 数据类型可以存储介于-128 和127 之间的整数值。
但是,TINYINT(1) 不会更改它可以存储的最小值或最大值。它只是说显示当该类型的值作为输出打印时只显示一个数字。
【讨论】:
mysql_field_len() 获取显示长度,然后调用substr() 或任何您需要适当显示值的方法,以防值溢出显示长度。