官方文档地址: 11.1.6 Numeric Type Attributes
显示宽度
MySQL 支持一个扩展,可以在类型的基础关键字后面的圆括号中选择性地指定整数数据类型的显示宽度。例如,INT(4)
指定一个显示宽度为4
位的整数。应用程序可以使用这个可选的显示宽度来显示(宽度小于指定显示宽度,用空格左填充到指定列宽度)整数值。(也就是说,这个宽度出现在结果集返回的元数据中。是否使用它取决于应用程序。)
显示宽度不限制可存储在列中的值的范围。它也不会阻止比列显示宽度宽的值正确显示。例如,指定为SMALLINT(3)
的列,通常的SMALLINT
范围是-32768
到32767
,超出3
位显示宽度的值会正常显示。
ZEROFILL
当与可选(非标准)ZEROFILL
属性一起使用时,默认的空格填充将被替换为零填充。例如,对于声明为INT(4) ZEROFILL
的列,值5
被检索为0005
。
注意
对于表达式或UNION
查询中涉及的列,ZEROFILL
属性将被忽略。
如果您将大于显示宽度的值存储在具有ZEROFILL
属性的整数列中,当 MySQL 为一些复杂的连接生成临时表时,可能会遇到问题。这种情况下,MySQL 假设数据值符合列显示宽度。
从 MySQL 8.0.17 开始,对于数值型数据类型,ZEROFILL
属性已被弃用,对于整数型数据类型,显示宽度属性也已被弃用。在未来的 MySQL 版本中,应该会删除对零填充和整数数据类型的显示宽度的支持。考虑使用另一种方法来产生这些属性的效果。例如,应用程序可以使用LPAD()
函数将数字零填充到所需的宽度,或者可以将格式化后的数字存储在CHAR
列中。
所有整数类型都可以有一个可选的(非标准的)UNSIGNED
属性。无符号类型可用于仅允许列中存在非负数,或者当需要为列设置更大的上限数值范围时。例如,如果一个INT
列是UNSIGNED
的,该列的范围的大小是相同的,但是它的两个端点都向上移动了,从-2147483648
和2147483647
移动到0
和4294967295
。
UNSIGNED
浮点和定点类型也可以是UNSIGNED
的。与整数类型一样,此属性防止负值存储在列中。与整数类型不同,列值的上限范围保持不变。从 MySQL 8.0.17 开始,对于FLOAT
、DOUBLE
和DECIMAL
类型的列(以及任何同义词),UNSIGNED
属性已被弃用,在未来的 MySQL 版本中,应该会删除对它们的支持。可以考虑对这样的列使用一个简单的CHECK
约束。
如果您为数值列指定了ZEROFILL
属性,MySQL 会自动添加UNSIGNED
属性。
AUTO_INCREMENT
整数或浮点数据类型可以具有AUTO_INCREMENT
属性。当您将NULL
值插入到已索引的AUTO_INCREMENT
列时,该列将被设置为下一个序列值。通常这是value+1
,其中value
是表中该列的最大值(AUTO_INCREMENT
序列以1
开头)。
在AUTO_INCREMENT
列中存储0
与存储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
约束中使用的现有列中。
从 MySQL 8.0.17 开始,FLOAT
和DOUBLE
列不支持AUTO_INCREMENT
;在未来的 MySQL 版本中,应该会删除它。考虑从这些列中删除AUTO_INCREMENT
属性,或者将它们转换为整数类型。