13.1.6 数值类型属性
MySQL 支持一个可选的扩展,用于在数据类型名称后面指定整数数据类型的显示宽度。在括号内指定的显示宽度可以由应用程序使用来显示值宽度小于列中指定宽度的整数值。例如,INT(4)
指定了一个 INT
类型,其显示宽度为四位数。这个可选的显示宽度可能会被应用程序用于左对齐整数值,使其填充到指定宽度中。该宽度在返回结果集的元数据中存在,但是否使用它取决于应用程序。
显示宽度并不限制存储在列中的值的范围,也不会阻止显示宽度超过列显示宽度的值被正确显示。例如,一个指定为 SMALLINT(3)
的 SMALLINT
类型的范围是 -32768
到 32767
,而值超出三位数范围则会以更长的数字形式显示。
在与可选(非标准)的 ZEROFILL
属性一起使用时,默认的填充空格被替换为零。例如,对于一个声明为 INT(4) ZEROFILL
的列,值 5
将被检索为 0005
。
属性 ZEROFILL
在表达式或 UNION
查询中涉及的列上被忽略。
如果在一个具有 ZEROFILL
属性的整数列中存储了比显示宽度更大的值,MySQL 在生成用于某些复杂连接的临时表时可能会遇到问题。在这些情况下,MySQL 假定数据值可以适应列的显示宽度。
属性 ZEROFILL
对于数值类型已被弃用,同样,对于整数类型的显示宽度也已被弃用。您应该预期在未来版本的 MySQL 中支持这些属性将会被移除。考虑使用替代方法来实现这些属性的效果。例如,应用程序可以使用 LPAD()
函数来对数字进行零填充直至所需宽度,或将格式化后的数字存储在 CHAR
列中。
所有整数类型都可以有一个可选(非标准)的 UNSIGNED
属性。一个无符号类型可以用于在列或当您需要更大的上限数字范围时限制只允许非负数值。例如,如果一个 INT
列是 UNSIGNED
,该列的范围大小保持不变,但其端点向上移动,从 -2147483648
和 2147483647
到 0
和 4294967295
。
浮点数和定点数类型也可以是 UNSIGNED
。与整数类型不同,这个属性不改变列值的范围上限。属性 UNSIGNED
对于类型 FLOAT
、DOUBLE
和 DECIMAL
(及其同义词)已被弃用,您应该预期在未来版本的 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 模式。
生成 AUTO_INCREMENT
值时插入 NULL
需要该列被声明为 NOT NULL
。如果列被声明为 NULL
,则插入 NULL
会存储一个 NULL
。当你将任何其他值插入到一个 AUTO_INCREMENT
列中时,该列会被设置为该值,并且序列重置,以便下一次自动生成的值顺序地从插入的值之后开始。
AUTO_INCREMENT
列中的负值不受支持。
CHECK
约束不能引用具有 AUTO_INCREMENT
属性的列,也不能将 AUTO_INCREMENT
属性添加到用于 CHECK
约束的现有列中。
AUTO_INCREMENT
对于 FLOAT
和 DOUBLE
列已被弃用;你应该预期将来版本的 MySQL 中对其支持的移除。考虑从这样的列中移除 AUTO_INCREMENT
属性,以避免潜在的兼容性问题,或者将它们转换为整数类型。