据我所知,tinyint(1)和tinyint(2)具有相同的存储空间范围。
唯一的区别是显示宽度是有区别的。这是否意味着tinyint(1)将存储所有类型的整数,但只能正确显示0到9的范围? tinyint(2)只能正确显示0到99吗?
并且提到最大尺寸是tinyint(255)。还有其他像varchar(500)类型的宽度。除非存储一篇文章,否则在什么情况下你需要如此大的文本和整数显示宽度?像密码加密还是什么?
如果问题中写的任何上述信息有误,请纠正我。
添加问题:显示宽度仅适用于char,varchar等,但不适用于整数类型。
但是,为什么还要加“M”,因为对于整数来说,除了zerofill之外它不会对它进行存储会产生什么影响呢?
答案 0 :(得分:4)
您的混淆解决方案是 -
在Mysql中,int(6)并不意味着它们最多可以存储6位数。不超过999999.
然而CHAR(6) 这意味着一个字符列,最大长度为6个字符,例如:
房屋
如果我尝试在该列中存储“特殊”一词,MySQL会将值斩断为“specia”,因为原始单词有7个字符。
无论如何,整数列都具有允许的预设值范围。括号中的数字仅表示显示宽度。
这可能仍然令人困惑,所以让我进一步解释......
显示宽度是1到255之间的数字。如果希望所有整数值“出现”类似,可以设置显示宽度:
TINYINT [(M)] [UNSIGNED] [ZEROFILL]
M表示整数类型的最大显示宽度。最大显示宽度为255.显示宽度与类型可包含的值范围无关。对于浮点和定点类型,M是可以存储的总位数。
如果为数字列指定ZEROFILL,MySQL会自动将UNSIGNED属性添加到列中。
所以你的问题的答案是
create table foo
(
col2 tinyint(2) unsigned zerofill, col4 tinyint(4) unsigned zerofill, col5notzerofill tinyint(5)
)engine=innodb;
insert into foo values (1,2,3),(11,12,14),(123,123,156),(1234,1234,12756);
select * from foo;
OUTPUT :-
+------+------+-----------------+
| col2 | col4 | col5notzerofill |
+------+------+-----------------+
| 01 | 0002 | 3 |
| 11 | 0012 | 14 |
| 123 | 0123 | 127 |
| 255 | 0255 | 127 |
+------+------+-----------------+
*所以明白,在Mysql中显示宽度只适用于zerofill。
*如果您使用不使用zerofill,则无效。
如果你使用zerofill然后mysql将检查显示widht,如果你没有分配,那么mysql将自动为该列分配display-width。 *