Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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]

    一个非常小的整数。有符号范围为-128到127,无符号范围为0到255。

  • BOOL, BOOLEAN

    这些类型是TINYINT(1)的同义词。值为0被认为是假。非零值被认为是真:

    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仅仅是对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]

    一个小整数。有符号的范围是 -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

    SERIAL 是对 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名。

    关于 BIGINT 列的一些事情:

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

    一个精确的定点数。M是总位数(精度),D是小数点后的位数(精度)。小数点和(对于负数)-符号不计入M中。如果D为0,值没有小数点或小数部分。对DECIMAL的最大位数(M)为65,支持的小数位数(D)为30。如果D省略,默认为0。若M省略,默认为10。(还有对DECIMAL字面量的文本长度限制;见UNSIGNED,如果指定,不允许负值。UNSIGNED属性对于DECIMAL(以及任何同义词)列已被弃用;你应该预期对其支持的移除在MySQL的一个未来版本中。考虑使用简单的CHECK约束代替这样的列。

    如果指定了 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,如果指定,不允许负值。对于类型FLOAT(及其同义词)的列,UNSIGNED 属性已被弃用,您应该预期在未来版本的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,如果指定,不允许负值。对于类型FLOAT(及其同义词)的列,UNSIGNED 属性已被弃用,您应该预期在未来版本的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