MySQL支持在括号中指定整数数据类型的显示宽度的扩展。例如,INT(4)
指定了一个显示宽度为四位数字的INT
。这个可选的显示宽度可能被应用程序用来显示小于列宽的整数值,通过左填充空格。(也就是说,这个宽度存在于结果集的元数据中。是否使用它取决于应用程序。)
显示宽度并不限制可以存储在列中的值的范围。也不阻止宽度大于列显示宽度的值被正确显示。例如,指定为SMALLINT(3)
的列具有通常的SMALLINT
范围为-32768
到32767
,并且超出三位数字范围的值将使用多于三位数字显示。
当与可选的(非标准)ZEROFILL
属性一起使用时,默认的空格填充将被替换为零。例如,对于声明为INT(4) ZEROFILL
的列,值5
将被检索为0005
。
在表达式或UNION
查询中,ZEROFILL
属性将被忽略。
如果您在具有ZEROFILL
属性的整数列中存储了大于显示宽度的值,您可能会在MySQL生成临时表时遇到问题。在这些情况下,MySQL假设数据值适合列的显示宽度。
ZEROFILL
属性对于数字数据类型已经弃用,如同整数数据类型的显示宽度属性一样。您应该期望在未来版本的MySQL中删除对ZEROFILL
和整数数据类型显示宽度的支持。考虑使用替代方法来实现这些属性的效果。例如,应用程序可以使用LPAD()
函数来将数字左填充到所需的宽度,或者它们可以在CHAR
列中存储格式化的数字。
所有整数类型都可以具有可选的(非标准)UNSIGNED
属性。无符号类型可以用于仅允许非负数在列中,或者当您需要更大的上限数字范围时。例如,如果INT
列是UNSIGNED
,则该列的范围大小保持不变,但其端点向上移,從-2147483648
和2147483647
到0
和4294967295
。
浮点数和固定点数类型也可以是UNSIGNED
。与整数类型一样,这个属性防止负值被存储在列中。与整数类型不同的是,列值的上限范围保持不变。UNSIGNED
对于FLOAT
、DOUBLE
和DECIMAL
(及其同义词)已经弃用,您应该期望在未来版本的MySQL中删除对它的支持。考虑使用简单的CHECK
约束来代替这些列。
如果您指定了ZEROFILL
对于数字列,MySQL将自动添加UNSIGNED
属性。
整数或浮点数数据类型可以具有 AUTO_INCREMENT
属性。当您将 NULL
值插入到索引的 AUTO_INCREMENT
列中,该列将设置为下一个序列值。通常这是
,其中 值
+1值
是表中当前列的最大值。(AUTO_INCREMENT
序列从 1
开始。)
将 0
存储到 AUTO_INCREMENT
列中具有与存储 NULL
相同的效果,除非启用了 NO_AUTO_VALUE_ON_ZERO
SQL 模式。
要生成 AUTO_INCREMENT
值,需要将列声明为 NOT NULL
。如果列被声明为 NULL
,则插入 NULL
将存储 NULL
。当您将任何其他值插入到 AUTO_INCREMENT
列中时,该列将设置为该值,并且序列将被重置,以便下一个自动生成的值从插入的值顺序地跟随。
不支持 AUTO_INCREMENT
列中的负值。
CHECK
约束不能引用具有 AUTO_INCREMENT
属性的列,也不能将 AUTO_INCREMENT
属性添加到已有的 CHECK
约束中使用的列。
AUTO_INCREMENT
对于 FLOAT
和 DOUBLE
列已经弃用;您应该期望在未来版本的 MySQL 中删除对它的支持。考虑从这些列中删除 AUTO_INCREMENT
属性,以避免潜在的兼容性问题,或者将它们转换为整数类型。