文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  数值数据类型语法

13.1.1 数值数据类型语法

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

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

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

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

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

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

对于 FLOATDOUBLEDECIMAL(以及任何同义词)类型的列,UNSIGNED 属性已弃用;您应该期望在未来版本的 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 不等于 10

  • 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.24.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 模式,REAL 将是 FLOAT 的同义词,而不是 DOUBLE