对于整数数据类型,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)
的同义词。零值被认为是 false。非零值被认为是 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,值没有小数点或小数部分。DECIMAL
的最大位数(M
)为 65。支持的最大小数位数(D
)为 30。如果D
省略,默认为 0。如果M
省略,默认为 10。(还有一个限制,即DECIMAL
文本可以有多长;见第 14.24.3 节,“表达式处理”。)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
,如果指定,不允许负值。UNSIGNED
属性对于FLOAT
(及其同义词)列已弃用,并且您应该期望在未来版本的 MySQL 中删除对其支持。考虑使用简单的CHECK
约束来代替这些列。使用
FLOAT
可能会给您带来一些意外的问题,因为 MySQL 中的所有计算都是使用双精度进行的。请参阅 第 B.3.4.7 节,“解决无匹配行的问题”。 -
FLOAT(
p
) [UNSIGNED] [ZEROFILL]一个浮点数。
p
代表位精度,但 MySQL 只使用该值来确定是否使用FLOAT
或DOUBLE
作为结果数据类型。如果p
从 0 到 24,数据类型将变为FLOAT
,没有M
或D
值。如果p
从 25 到 53,数据类型将变为DOUBLE
,没有M
或D
值。结果列的范围与前面描述的单精度FLOAT
或双精度DOUBLE
数据类型相同。UNSIGNED
,如果指定,不允许负值。UNSIGNED
属性对于FLOAT
(及其同义词)列已弃用,并且您应该期望在未来版本的 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
。