根据文档,括号中的属性(例如SMALLINT(3)中的“3”)应该将SMALLINT值的显示约束为三位数。然而,当我插入五个测试数字(9,99,999,9999,99999)时,它将每个数字都取其全部值而不是将其加到三位数并相应地显示它(当然除了99999,它是上限为32767)。至少在显示时,数字是否应限制为三位数?或者我在这里错过了真正的目的吗?
答案 0 :(得分:3)
如the manual中所述:
M
表示整数类型的最大显示宽度。对于浮点和定点类型,M
是可以存储的总位数(精度)。对于字符串类型,M
是最大长度。M
的最大允许值取决于数据类型。
此外,正如所述here:
MySQL支持扩展,可以选择在类型的base关键字后面的括号中指定整数数据类型的显示宽度。例如,
INT(4)
指定显示宽度为四位的INT
。应用程序可以使用此可选显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格填充它们。 (也就是说,此宽度存在于使用结果集返回的元数据中。是否使用它取决于应用程序。)显示宽度不约束可以存储在列中的值的范围。它也不会阻止比列显示宽度更宽的值正确显示。例如,指定为
SMALLINT(3)
的列通常-32768
范围为32767
到ZEROFILL
,超出三位数允许范围的值将使用超过三位数。与可选(非标准)属性
5
一起使用时,默认的空格填充将替换为零。例如,对于声明为SMALLINT
的列,将0005
的值检索为ZEROFILL
。注意强>
当列涉及表达式或INT(4) ZEROFILL
查询时,将忽略ZEROFILL
属性。如果将大于显示宽度的值存储在具有
UNSIGNED
属性的整数列中,则在MySQL为某些复杂连接生成临时表时可能会遇到问题。在这些情况下,MySQL假定数据值符合列显示宽度。所有整数类型都可以具有可选(非标准)属性
UNSIGNED
。无符号类型可用于仅允许列中的非负数,或者当您需要列的较大上限数字范围时。例如,如果UNION
列为-2147483648
,则列的范围大小相同,但其端点从2147483647
和0
更改为4294967295
和UNSIGNED
。浮点和定点类型也可以是
ZEROFILL
。与整数类型一样,此属性可防止负值存储在列中。与整数类型不同,列值的上限范围保持不变。如果为数字列指定
UNSIGNED
,MySQL会自动将AUTO_INCREMENT
属性添加到列中。整数或浮点数据类型可以具有附加属性
NULL
。将值0
(推荐)或AUTO_INCREMENT
插入索引value
列时,该列将设置为下一个序列值。通常,这是+ 1
value
,其中值是最大的AUTO_INCREMENT
表示当前列中的列。1
序列以{{1}}开头。
答案 1 :(得分:2)
对于整数类型,该属性与显示宽度相关,只有在将zerofill添加到列create语句时才能看到该属性。
显示宽度不会影响分配给列的存储,只会影响启用zerofill时的填充显示。
另见解释:http://matthom.com/archive/2006/11/28/mysql-integer-columns-and-display-width