Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Numeric Data Type Syntax

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 VALUE 在整数列的定义中是 NOT NULL AUTO_INCREMENT UNIQUE 的别名。

Warning

当您在整数值之间进行减法运算,其中一个是 UNSIGNED 类型时,结果是无符号的,除非启用了 NO_UNSIGNED_SUBTRACTION SQL 模式。见 第 14.10 节,“强制函数和操作符”

  • BIT[(M)]

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

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

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

  • BOOL, BOOLEAN

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

    然而,值 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.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 模式,REALFLOAT 的同义词,而不是 DOUBLE