数值数据类型语法
对于整数数据类型,M
指示最大显示宽度。最大显示宽度为255。显示宽度与类型可以存储的值的范围无关,如“数字类型属性”中所述。
对于浮点和定点数据类型,M
是可以存储的总位数。
从MySQL 8.0.17开始,对于整数数据类型,不建议使用display width属性,并且在将来的MySQL版本中将删除对它的支持。
如果ZEROFILL
为数字列指定,MySQL会自动将该UNSIGNED
属性添加到该列。
从MySQL 8.0.17开始,ZEROFILL
不推荐使用数字数据类型的属性,并且在将来的MySQL版本中将不再支持该属性。考虑使用替代方法来产生此属性的效果。例如,应用程序可以使用该LPAD()
功能对数字进行零填充以达到所需的宽度,或者可以将格式化的数字存储在CHAR
列中。
允许该UNSIGNED
属性的数值数据类型也允许SIGNED
。但是,这些数据类型默认情况下是签名的,因此该SIGNED
属性无效。
从MySQL 8.0.17开始,该UNSIGNED
属性不适用于类型为FLOAT
,DOUBLE
和和DECIMAL
(以及任何同义词)的列,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK
对此类列使用简单约束。
SERIAL
是的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
。
SERIAL DEFAULT VALUE
在整数列的定义中,是的别名NOT NULL AUTO_INCREMENT UNIQUE
。
警告当您在类型为1的整数值之间使用减法时
UNSIGNED
,除非NO_UNSIGNED_SUBTRACTION
启用了SQL模式,否则结果是无符号的。请参见“信息函数”。
BIT[(M)]
位值类型。
M
表示每个值的位数,从1到64。如果M
省略,默认值为1 。TINYINT[(M)][UNSIGNED][ZEROFILL]
一个非常小的整数。签署的范围是
-128
到127
。无符号的范围是0
到255
。BOOL
,BOOLEAN
这些类型是的同义词
TINYINT(1)
。零值被认为是错误的。非零值被视为true:mysql>
SELECT IF(0, 'true', 'false'); +------------------------ + | IF(0, 'true', 'false') | +------------------------ + | false | +------------------------ + mysql>SELECT IF(1, 'true', 'false'); +------------------------ + | IF(1, 'true', 'false') | +------------------------ + | true | +------------------------ + mysql>SELECT IF(2, 'true', 'false'); +------------------------ + | IF(2, 'true', 'false') | +------------------------ + | true | +------------------------ +然而,这些值
TRUE
和FALSE
仅是别名1
和0
分别,如下所示:mysql>
SELECT IF(0 = FALSE, 'true', 'false'); +-------------------------------- + | IF(0 = FALSE, 'true', 'false') | +-------------------------------- + | true | +-------------------------------- + mysql>SELECT IF(1 = TRUE, 'true', 'false'); +------------------------------- + | IF(1 = TRUE, 'true', 'false') | +------------------------------- + | true | +------------------------------- + mysql>SELECT IF(2 = TRUE, 'true', 'false'); +------------------------------- + | IF(2 = TRUE, 'true', 'false') | +------------------------------- + | false | +------------------------------- + mysql>SELECT IF(2 = FALSE, 'true', 'false'); +-------------------------------- + | IF(2 = FALSE, 'true', 'false') | +-------------------------------- + | false | +-------------------------------- +最后两个语句显示显示的结果,因为
2
既不等于1
也不等于0
。SMALLINT[(M)][UNSIGNED][ZEROFILL]
一个小整数。签署的范围是
-32768
到32767
。无符号的范围是0
到65535
。MEDIUMINT[(M)][UNSIGNED][ZEROFILL]
中型整数。签署的范围是
-8388608
到8388607
。无符号的范围是0
到16777215
。INT[(M)][UNSIGNED][ZEROFILL]
普通大小的整数。签署的范围是
-2147483648
到2147483647
。无符号的范围是0
到4294967295
。INTEGER[(M)][UNSIGNED][ZEROFILL]
此类型是的同义词
INT
。BIGINT[(M)][UNSIGNED][ZEROFILL]
一个大整数。签署的范围是
-9223372036854775808
到9223372036854775807
。无符号的范围是0
到18446744073709551615
。SERIAL
是的别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
。关于
BIGINT
列,您应该注意以下几点:所有算术都是使用有符号
BIGINT
或DOUBLE
值完成的,因此9223372036854775807
除位函数外,不要使用大于(63位)的无符号大整数!如果这样做,由于将BIGINT
值转换为时的舍入错误,结果中的最后几位可能会出错DOUBLE
。MySQL
BIGINT
在以下情况下可以处理:- 使用整数将大的无符号值存储在
BIGINT
列中时。 - 在或中,其中指的是列。
MIN(col_name)
MAX(col_name)
col_name
BIGINT
- 当使用操作符(
+
,-
,*
,等等),其中两个操作数都是整数。
- 使用整数将大的无符号值存储在
- 您始终可以
BIGINT
通过使用字符串将精确的整数值存储在列中。在这种情况下,MySQL执行的字符串到数字的转换不涉及中间的双精度表示形式。 -
,+
和*
运营商使用BIGINT
,当两个操作数是整数值运算。这意味着,如果您将两个大整数相乘(或返回整数的函数的结果),则当结果大于时,可能会得到意外的结果9223372036854775807
。
DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]
压缩的“精确”定点数字。
M
是位数的总数(精度),D
是小数点后的位数(小数位数)。小数点和(对于负数)-
符号不计入M
。如果D
为0,则值没有小数点或小数部分。的最大位数(M
)为DECIMAL
65。支持的小数位数(D
)的最大值为30。如果D
省略,则默认值为0。如果M
省略,则默认值为10。UNSIGNED
,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED
不推荐使用类型DECIMAL
(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK
对此类列使用简单约束。所有
+,-,*,/
带DECIMAL
列的基本计算()的精度为65位。DEC[(M[,D])][UNSIGNED][ZEROFILL]
,,NUMERIC[(M[,D])][UNSIGNED][ZEROFILL]
FIXED[(M[,D])][UNSIGNED][ZEROFILL]
这些类型是的同义词
DECIMAL
。该FIXED
同义词可用于与其他数据库系统兼容。FLOAT[(M,D)][UNSIGNED][ZEROFILL]
一个小的(单精度)浮点数。允许值是
-3.402823466E +38
对-1.175494351E-38
,0
以及1.175494351E-38
对3.402823466E +38
。这些是基于IEEE标准的理论极限。实际范围可能会略小,具体取决于您的硬件或操作系统。M
是位数的总和,D
是小数点后的位数。如果M
和D
省略,则将值存储到硬件允许的极限。单精度浮点数的精度约为小数点后7位。FLOAT(M,D)
是非标准的MySQL扩展。从MySQL 8.0.17开始,不推荐使用此语法,并且在将来的MySQL版本中将不再支持该语法。UNSIGNED
,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED
不推荐使用类型FLOAT
(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK
对此类列使用简单约束。使用
FLOAT
MySQL可能会给您带来一些意想不到的问题,因为MySQL中的所有计算都是以双精度完成的。请参见第B.4.4.7节“解决没有匹配行的问题”。FLOAT(p)[UNSIGNED][ZEROFILL]
浮点数。
p
代表以位为单位的精度,但是MySQL仅使用此值来确定是使用FLOAT
还是DOUBLE
用于结果数据类型。如果p
从0到24,则数据类型将变为FLOAT
noM
或D
values。如果p
是25到53,则数据类型将变为DOUBLE
noM
或D
values。结果列的范围与本节前面介绍的单精度FLOAT
或双精度DOUBLE
数据类型相同。UNSIGNED
,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED
不推荐使用类型FLOAT
(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK
对此类列使用简单约束。FLOAT(p)
提供了语法以实现ODBC兼容性。DOUBLE[(M,D)][UNSIGNED][ZEROFILL]
普通大小(双精度)浮点数。允许值是
-1.7976931348623157E +308
对-2.2250738585072014E-308
,0
以及2.2250738585072014E-308
对1.7976931348623157E +308
。这些是基于IEEE标准的理论极限。实际范围可能会略小,具体取决于您的硬件或操作系统。M
是位数的总和,D
是小数点后的位数。如果M
和D
省略,则将值存储到硬件允许的极限。双精度浮点数精确到大约15个小数位。DOUBLE(M,D)
是非标准的MySQL扩展。从MySQL 8.0.17开始,不推荐使用此语法,并且在将来的MySQL版本中将不再支持该语法。UNSIGNED
,如果指定,则不允许使用负值。从MySQL 8.0.17开始,UNSIGNED
不推荐使用类型DOUBLE
(和任何同义词)类型的列的属性,并且在将来的MySQL版本中将不再支持该属性。考虑CHECK
对此类列使用简单约束。DOUBLE PRECISION[(M,D)][UNSIGNED][ZEROFILL]
,REAL[(M,D)][UNSIGNED][ZEROFILL]
这些类型是的同义词
DOUBLE
。例外:如果REAL_AS_FLOAT
启用了 SQL模式,REAL
则是FLOAT
而不是的同义词DOUBLE
。