11.1.1 数值数据类型语法
对于整数数据类型,* M
*table 示最大显示宽度。最大显示宽度为 255.显示宽度与类型可以存储的值的范围无关,如第 11.1.6 节“数值类型属性”中所述。
对于浮点和定点数据类型,* M
*是可存储的总位数。
如果为数字列指定ZEROFILL
,MySQL 会自动将UNSIGNED
属性添加到该列。
允许UNSIGNED
属性的数值数据类型也允许SIGNED
。但是,这些数据类型默认情况下是带符号的,因此SIGNED
属性无效。
SERIAL
是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的别名。
整数列的定义中的SERIAL DEFAULT VALUE
是NOT NULL AUTO_INCREMENT UNIQUE
的别名。
Warning
当您在整数值为UNSIGNED
的整数值之间使用减法时,除非启用了NO_UNSIGNED_SUBTRACTION SQL 模式,否则结果将是无符号的。参见第 12.10 节“Broadcast 函数和运算符”。
位值类型。 * M
table 示每个值的位数,从 1 到 64.如果省略 M
*,则默认值为 1.
一个非常小的整数。签名范围是-128
到127
。无符号范围是0
到255
。
这些类型是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
。
一个小整数。签名范围是-32768
到32767
。无符号范围是0
到65535
。
中型整数。签名范围是-8388608
到8388607
。无符号范围是0
到16777215
。
普通大小的整数。签名范围是-2147483648
到2147483647
。无符号范围是0
到4294967295
。
此类型是INT的同义词。
一个大整数。签名范围是-9223372036854775808
到9223372036854775807
。无符号范围是0
到18446744073709551615
。
SERIAL
是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的别名。
关于BIGINT列,您应该注意一些事项:
- 所有算术都是使用有符号的BIGINT或DOUBLE值完成的,因此除位函数外,不要使用大于
9223372036854775807
(63 位)的无符号大整数!如果这样做,则由于将BIGINT值转换为DOUBLE时的舍入错误,结果中的最后几位可能会出错。
在以下情况下,MySQL 可以处理BIGINT:
-
使用整数将大的无符号值存储在BIGINT列中时。
打包的“精确”定点数。 * M
是位数(精度), D
是小数点后的位数(小数位数)。小数点和-
符号(对于负数)不计入 M
。如果 D
为 0,则值没有小数点或小数部分。 DECIMAL的最大位数( M
)为 65.支持的小数位数( D
)的最大值为 30.如果省略 D
,则默认值为 0.如果省略 M
*,则默认值是 10.(DECIMALLiterals 的文本长度也有限制;请参见第 12.22.3 节“table 达式处理”。)
UNSIGNED
(如果已指定)不允许使用负值。
具有DECIMAL列的所有基本计算(+, -, *, /
)的精度为 65 位数字。
这些类型是DECIMAL的同义词。 FIXED同义词可用于与其他数据库系统兼容。
一个小的(单精度)浮点数。允许的值为-3.402823466E+38
到-1.175494351E-38
,0
和1.175494351E-38
到3.402823466E+38
。这些是基于 IEEE 标准的理论限制。实际范围可能会略小,具体取决于您的硬件或 os。
M
是位数,D
是小数点后的位数。如果省略M
和D
*,则将值存储到硬件允许的限制内。单精度浮点数的精度约为小数点后 7 位。
FLOAT(M,D)
是非标准的 MySQL 扩展。
UNSIGNED
(如果已指定)不允许使用负值。
使用FLOAT可能会给您带来一些意想不到的问题,因为 MySQL 中的所有计算都是以双精度进行的。参见第 B.4.4.7 节“解决没有匹配行的问题”。
浮点数。 * p
table 示以位为单位的精度,但是 MySQL 仅使用此值来确定对结果数据类型使用FLOAT还是DOUBLE。如果 p
从 0 到 24,则数据类型将变为FLOAT,没有 M
或 D
值。如果 p
从 25 到 53,则数据类型将变为DOUBLE,而没有 M
或 D
*值。结果列的范围与本节前面介绍的单精度FLOAT或双精度DOUBLE数据类型相同。
提供 FLOAT(p)语法以实现 ODBC 兼容性。
普通大小(双精度)浮点数。允许的值为-1.7976931348623157E+308
到-2.2250738585072014E-308
,0
和2.2250738585072014E-308
到1.7976931348623157E+308
。这些是基于 IEEE 标准的理论限制。实际范围可能会略小,具体取决于您的硬件或 os。
M
是位数,D
是小数点后的位数。如果省略M
和D
*,则将值存储到硬件允许的限制内。双精度浮点数精确到大约 15 个小数位。
DOUBLE(M,D)
是非标准的 MySQL 扩展。
UNSIGNED
(如果已指定)不允许使用负值。
这些类型是DOUBLE的同义词。exception:如果启用了REAL_AS_FLOAT SQL 模式,则REAL是FLOAT而不是DOUBLE的同义词。