13.1.1 数值数据类型语法
对于整数数据类型,M
表示最小显示宽度。最大显示宽度为255。显示宽度与一个类型可以存储的值范围无关联,详见第13.1.6节,“数值类型属性”。
对于浮点数和定点数数据类型,M
是可以存储的总位数。
显示宽度属性对整数数据类型已废弃;您应该预期在未来版本的MySQL中支持它将被移除。
如果为数字列指定ZEROFILL
,MySQL 将自动添加UNSIGNED
属性到列中。
ZEROFILL
属性对数值数据类型已废弃;您应该预期在未来版本的MySQL中支持它将被移除。考虑使用替代方法来实现该属性的效果,例如应用程序可以使用LPAD()
函数对数字进行零填充,或将格式化后的数字存储在CHAR
列中。
允许UNSIGNED
属性的数值数据类型也允许SIGNED
。然而,这些数据类型默认为有符号,因此SIGNED
属性无效。
对于FLOAT
、DOUBLE
和DECIMAL
(以及任何同义词),UNSIGNED
属性已废弃;您应该预期在未来版本的MySQL中支持它将被移除。考虑使用简单的CHECK
约束代替。
SERIAL
是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的别名。
SERIAL DEFAULT VALUE
在整数列的定义中是 NOT NULL AUTO_INCREMENT UNIQUE
的别名。
当在整数值之间进行减法运算,其中一个为类型UNSIGNED
时,如果启用了NO_UNSIGNED_SUBTRACTION
SQL 模式,结果将是无符号的。详见第14.10节,“转换函数和操作符”。
-
位值类型。
M
表示每个值的位数,范围从1到64。缺省为1,如果省略了M
。 -
TINYINT[(
M
)] [UNSIGNED] [ZEROFILL]一个非常小的整数。有符号范围为-128到127,无符号范围为0到255。
-
这些类型是
TINYINT(1)
的同义词。值为0被认为是假。非零值被认为是真: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
值进行,因此你不应该使用除非在使用位操作!如果你这样做,结果中的最后一些数字可能会因为将BIGINT
值转换为DOUBLE
时产生的舍入错误而有误。MySQL 可以处理
BIGINT
在以下情况下:-
当使用整数来存储大无符号值时,在一个
BIGINT
列中。 -
在
MIN(
或col_name
)MAX(
中,其中col_name
)col_name
指的是一个BIGINT
列。 -
当使用运算符(
+
,-
,*
等)其中两个操作数都是整数时,可以始终将一个精确的整数值存储在一个BIGINT列中,通过使用字符串。这种情况下,MySQL执行的是一个不涉及双精度浮点表示的字符串到数字转换。
-
-
当两个整数值相加或相减时,
-
、+
和*
运算符使用BIGINT的整数运算。这意味着如果你将两个大整数(或者返回整数值的函数)相乘,你可能会在结果超过9223372036854775807
时得到意外结果。 -
当两个操作数都是整数值时,
-
、+
和*
运算符使用BIGINT
算法。这意味着,如果您将两个大整数(或返回整数的函数的结果)相乘,当结果大于9223372036854775807
时,您可能会得到意想不到的结果。
-
-
DECIMAL[(
M
[,D
])] [UNSIGNED] [ZEROFILL]一个精确的定点数。
M
是总位数(精度),D
是小数点后的位数(精度)。小数点和(对于负数)-
符号不计入M
中。如果D
为0,值没有小数点或小数部分。对DECIMAL的最大位数(M
)为65,支持的小数位数(D
)为30。如果D
省略,默认为0。若M
省略,默认为10。(还有对DECIMAL字面量的文本长度限制;见UNSIGNED
,如果指定,不允许负值。UNSIGNED
属性对于DECIMAL(以及任何同义词)列已被弃用;你应该预期对其支持的移除在MySQL的一个未来版本中。考虑使用简单的CHECK
约束代替这样的列。如果指定了
UNSIGNED
,则不允许使用负值。UNSIGNED
属性已弃用于DECIMAL
类型(及其任何同义词)的列;您应该预期在未来版本的 MySQL 中会移除对它的支持。对于此类列,请考虑改用简单的CHECK
约束。所有基本计算(
+, -, *, /
)与DECIMAL列进行时,都使用65位的精度。 -
DEC[(
M
[,D
])] [UNSIGNED] [ZEROFILL], NUMERIC[(M
[,D
])] [UNSIGNED] [ZEROFILL], FIXED[(M
[,D
])] [UNSIGNED] [ZEROFILL] -
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(
是MySQL的一个非标准扩展。这条语法已被弃用,您应该预期在未来版本的MySQL中对其支持将被移除。M
,D
)UNSIGNED
,如果指定,不允许负值。对于类型FLOAT
(及其同义词)的列,UNSIGNED
属性已被弃用,您应该预期在未来版本的MySQL中对其支持将被移除。考虑使用简单的CHECK
约束代替这样的列。FLOAT
可能会给您一些意外的问题,因为MySQL中的所有计算都是以双精度进行的。参见第B.3.4.7节,“解决没有匹配行的问题”。 -
一个浮点数,
p
表示位数,但MySQL只使用这个值来决定是否使用FLOAT
或DOUBLE
作为结果数据类型。如果p
在0到24之间,数据类型变为FLOAT
,没有M
或D
值。如果p
在25到53之间,数据类型变为DOUBLE
,没有M
或D
值。结果列的范围与前面本节中描述的单精度FLOAT
或双精度DOUBLE
类型相同。UNSIGNED
,如果指定,不允许负值。对于类型FLOAT
(及其同义词)的列,UNSIGNED
属性已被弃用,您应该预期在未来版本的MySQL中对其支持将被移除。考虑使用简单的CHECK
约束代替这样的列。FLOAT(
语法用于ODBC兼容性。p
) -
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(
是MySQL的一个非标准扩展;已经被弃用。您应该预期对此语法的支持在未来版本的MySQL中会被移除。M
,D
)UNSIGNED
,如果指定,将禁止负值。UNSIGNED
属性对于类型DOUBLE
(及其同义词)的列已经被弃用,您应该预期对此属性的支持在未来版本的MySQL中会被移除。考虑使用简单的CHECK
约束代替这样的列。 -
DOUBLE PRECISION[(
,M
,D
)] [UNSIGNED] [ZEROFILL]REAL[(
M
,D
)] [UNSIGNED] [ZEROFILL]这些类型是
DOUBLE
的同义词。例外情况:如果启用了REAL_AS_FLOAT
SQL模式,REAL
是对FLOAT
的同义词,而不是DOUBLE
。