文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  数字数据类型语法

13.1.1 数字数据类型语法

对于整数数据类型,M 表示最小显示宽度。最大显示宽度为 255。显示宽度与类型可以存储的值范围无关,如 第 13.1.6 节,“数字类型属性” 中所述。

对于浮点数和定点数数据类型,M 是可以存储的总位数。

显示宽度属性已弃用,不再适用于整数数据类型;您应该预期在未来的 MySQL 版本中删除对它的支持。

如果为数字列指定 ZEROFILL,MySQL 会自动将 UNSIGNED 属性添加到该列。

ZEROFILL 属性已弃用,不再适用于数字数据类型;您应该预期在未来的 MySQL 版本中删除对它的支持。请考虑使用其他方法来实现此属性的效果。例如,应用程序可以使用 LPAD() 函数将数字填充到所需的宽度,或者将格式化的数字存储在 CHAR 列中。

允许使用 UNSIGNED 属性的数字数据类型也允许使用 SIGNED。但是,这些数据类型默认情况下是有符号的,因此 SIGNED 属性没有效果。

UNSIGNED 属性已弃用,不再适用于类型为 FLOATDOUBLEDECIMAL(以及任何同义词)的列;您应该预期在未来的 MySQL 版本中删除对它的支持。对于此类列,请考虑使用简单的 CHECK 约束代替。

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。

在整数列的定义中,SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE 的别名。

警告

当您使用整数值之间的减法,其中一个值类型为 UNSIGNED 时,结果将是无符号的,除非启用了 NO_UNSIGNED_SUBTRACTION SQL 模式。请参阅 第 14.10 节,“强制转换函数和运算符”

  • BIT[(M)]

    位值类型。 M 表示每个值的位数,从 1 到 64。如果省略 M,则默认为 1。

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

    一个非常小的整数。有符号范围为 -128127。无符号范围为 0255

  • BOOLBOOLEAN

    这些类型是 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                   |
    +------------------------+

    但是,值 TRUEFALSE 仅仅是 10 的别名,如这里所示

    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]

    一个小整数。有符号范围为 -3276832767。无符号范围为 065535

  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

    一个中等大小的整数。有符号范围为 -83886088388607。无符号范围为 016777215

  • INT[(M)] [UNSIGNED] [ZEROFILL]

    一个正常大小的整数。有符号范围为 -21474836482147483647。无符号范围为 04294967295

  • INTEGER[(M)] [UNSIGNED] [ZEROFILL]

    此类型是 INT 的同义词。

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

    一个大整数。有符号范围为 -92233720368547758089223372036854775807。无符号范围为 018446744073709551615

    SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。

    关于 BIGINT 列,您需要注意以下几点

    • 所有算术运算都使用带符号的 BIGINTDOUBLE 值进行,因此您不应使用大于 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]

    这些类型是 DECIMAL 的同义词。 FIXED 同义词可用于与其他数据库系统兼容。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    一个小的(单精度)浮点数。 允许的值为 -3.402823466E+38-1.175494351E-380 以及 1.175494351E-383.402823466E+38。 这些是基于 IEEE 标准的理论极限。 实际范围可能会根据您的硬件或操作系统略有不同。

    M 是总位数,D 是小数点后的位数。 如果省略了 MD,则会将值存储到硬件允许的极限。 单精度浮点数的精度约为 7 位小数。

    FLOAT(M,D) 是非标准的 MySQL 扩展。 此语法已弃用,您应该预计在 MySQL 的未来版本中将删除对它的支持。

    如果指定了 UNSIGNED,则不允许负值。 UNSIGNED 属性已弃用,不适用于类型为 FLOAT(以及任何同义词)的列;您应该预计在 MySQL 的未来版本中将删除对它的支持。 对于此类列,请考虑改用简单的 CHECK 约束。

    使用 FLOAT 可能会给您带来一些意想不到的问题,因为 MySQL 中的所有计算都是使用双精度进行的。 请参阅 第 B.3.4.7 节,“解决没有匹配行的問題”

  • FLOAT(p) [UNSIGNED] [ZEROFILL]

    一个浮点数。 p 表示以位为单位的精度,但 MySQL 仅使用此值来确定是否使用 FLOATDOUBLE 作为结果数据类型。 如果 p 从 0 到 24,则数据类型变为 FLOAT,没有 MD 值。 如果 p 从 25 到 53,则数据类型变为 DOUBLE,没有 MD 值。 结果列的范围与本节前面介绍的单精度 FLOAT 或双精度 DOUBLE 数据类型相同。

    如果指定了 UNSIGNED,则不允许负值。 UNSIGNED 属性已弃用,不适用于类型为 FLOAT(以及任何同义词)的列;您应该预计在 MySQL 的未来版本中将删除对它的支持。 对于此类列,请考虑改用简单的 CHECK 约束。

    FLOAT(p) 语法是为了 ODBC 兼容性而提供的。

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    一个正常大小的(双精度)浮点数。 允许的值为 -1.7976931348623157E+308-2.2250738585072014E-3080 以及 2.2250738585072014E-3081.7976931348623157E+308。 这些是基于 IEEE 标准的理论极限。 实际范围可能会根据您的硬件或操作系统略有不同。

    M 是总位数,D 是小数点后的位数。 如果省略了 MD,则会将值存储到硬件允许的极限。 双精度浮点数的精度约为 15 位小数。

    DOUBLE(M,D) 是非标准的 MySQL 扩展;并且已弃用。 您应该预计在 MySQL 的未来版本中将删除对此语法的支持。

    如果指定了 UNSIGNED,则不允许负值。 UNSIGNED 属性已弃用,不适用于类型为 DOUBLE(以及任何同义词)的列;您应该预计在 MySQL 的未来版本中将删除对它的支持。 对于此类列,请考虑改用简单的 CHECK 约束。

  • DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]REAL[(M,D)] [UNSIGNED] [ZEROFILL]

    这些类型是 DOUBLE 的同义词。例外:如果启用了 REAL_AS_FLOAT SQL 模式,则 REALFLOAT 的同义词,而不是 DOUBLE