对于整数数据类型,M
表示最小显示宽度。最大显示宽度为 255。显示宽度与类型可以存储的值范围无关,如 第 13.1.6 节,“数字类型属性” 中所述。
对于浮点数和定点数数据类型,M
是可以存储的总位数。
显示宽度属性已弃用,不再适用于整数数据类型;您应该预期在未来的 MySQL 版本中删除对它的支持。
如果为数字列指定 ZEROFILL
,MySQL 会自动将 UNSIGNED
属性添加到该列。
ZEROFILL
属性已弃用,不再适用于数字数据类型;您应该预期在未来的 MySQL 版本中删除对它的支持。请考虑使用其他方法来实现此属性的效果。例如,应用程序可以使用 LPAD()
函数将数字填充到所需的宽度,或者将格式化的数字存储在 CHAR
列中。
允许使用 UNSIGNED
属性的数字数据类型也允许使用 SIGNED
。但是,这些数据类型默认情况下是有符号的,因此 SIGNED
属性没有效果。
UNSIGNED
属性已弃用,不再适用于类型为 FLOAT
、DOUBLE
和 DECIMAL
(以及任何同义词)的列;您应该预期在未来的 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。如果省略M
,则默认为 1。TINYINT[(
M
)] [UNSIGNED] [ZEROFILL]一个非常小的整数。有符号范围为
-128
到127
。无符号范围为0
到255
。这些类型是
TINYINT(1)
的同义词。值为零被视为假。非零值被视为真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.25.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
。