MySQL 支持一个扩展,可以 optionally 指定整数数据类型的显示宽度,方法是在类型的基本关键字后面的括号中指定宽度。例如,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
。与整数类型一样,此属性可防止将负值存储在列中。与整数类型不同,列值的上限范围保持不变。不建议对 FLOAT
、DOUBLE
和 DECIMAL
类型(及其任何同义词)的列使用 UNSIGNED
,并且您应该预计在未来版本的 MySQL 中将删除对它的支持。请考虑对这些列使用简单的 CHECK
约束。
如果为数值列指定 ZEROFILL
,则 MySQL 会自动添加 UNSIGNED
属性。
整数或浮点数据类型可以具有 AUTO_INCREMENT
属性。当您将 NULL
值插入到已编制索引的 AUTO_INCREMENT
列中时,该列将设置为下一个序列值。通常,这是
,其中 value
+1value
是表中当前该列的最大值。(AUTO_INCREMENT
序列从 1
开始。)
将 0
存储到 AUTO_INCREMENT
列中与存储 NULL
具有相同的效果,除非启用了 NO_AUTO_VALUE_ON_ZERO
SQL 模式。
插入 NULL
以生成 AUTO_INCREMENT
值要求将该列声明为 NOT NULL
。如果该列声明为 NULL
,则插入 NULL
将存储 NULL
。当您将任何其他值插入到 AUTO_INCREMENT
列中时,该列将设置为该值,并且序列将重置,以便下一个自动生成的值按顺序从插入的值开始。
不支持 AUTO_INCREMENT
列的负值。
CHECK
约束不能引用具有 AUTO_INCREMENT
属性的列,也不能将 AUTO_INCREMENT
属性添加到 CHECK
约束中使用的现有列。
不建议对 FLOAT
和 DOUBLE
列使用 AUTO_INCREMENT
;您应该预计在未来版本的 MySQL 中将删除对它的支持。请考虑从这些列中删除 AUTO_INCREMENT
属性,以避免潜在的兼容性问题,或者将它们转换为整数类型。