5

我知道 tinyint(1) 和 tinyint(2) 具有相同的存储空间范围。

唯一的区别是显示宽度是不同的。这是否意味着 tinyint(1) 将存储所有类型的整数但仅正确显示 0 到 9 的范围?而 tinyint(2) 仅正确显示 0 到 99?

并且提到最大尺寸是tinyint(255)。还有其他像 varchar(500) 类型的宽度。除非正在存储一篇文章,否则在什么情况下需要如此大的文本和整数显示宽度?比如密码加密什么的?

如果问题中写的上述任何信息有误,请纠正我。

附加问题:显示宽度仅适用于 char、varchar 等,但不适用于整数类型。

但是,为什么还要加上“M”,因为对于整数,除了 zerofill 之外,它不会对存储它产生影响?

4

1 回答 1

7

您对混乱的解决方案是-

在 Mysql 中, int(6) 并不意味着它们最多可以存储 6 位数字。不超过 999999。

但是 CHAR(6) 这表示一个字符列,最大长度为 6 个字符,例如这些单词:

房屋

如果我尝试在该列中存储单词“special”,MySQL 会将值截断为“specia”,因为原始单词有 7 个字符。

无论如何,整数列都具有允许的预设值范围。括号中的数字仅表示显示宽度。

这可能仍然令人困惑,所以让我进一步解释......</p>

显示宽度是一个从 1 到 255 的数字。如果您希望所有整数值以类似方式“出现”,您可以设置显示宽度:

TINYINT[(M)] [未签名] [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 将检查 display widht ,如果你不指定,那么 mysql 会自动为该列分配 display-width 。*

于 2013-07-29T07:20:32.840 回答