11.1.1 数值类型语法

原文地址:https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html

对于整型数据类型来说,M 表示最大显示宽度,支持的最大显示宽度是255,正如 第11.1.6节 数值型的属性 所介绍的,显示宽度和一个类型所能存储的值的范围没有关联。

对于浮点数和定点数来说,M 是一个数字的总位数。

在MySQL8.0.17版本中,整型类型的显示宽度属性被标记为过时的,并会在将来的版本中移除。

如果你为数值型字段指定了ZEROFILL属性,MySQL会自动给这个字段添加UNSIGNED属性。

在MySQL8.0.17版本中,数值型字段的ZEROFILL属性被标记为过时的,并会在将来的版本中移除。考虑使用一个替代方案来实现相同的效果,例如,应用中可以使用LPAD()函数来添加前置0来达到想要的宽度,或者用CHAR类型来存储格式化后的数值。

数值类型允许设置UNSIGNED或SIGNED属性,默认是SIGNED,因此设置SIGNED属性和没设置的效果是一样的。

在MySQL8.0.17中,FLOAT、DOUBLE和DECIMAL(以及它们的同义词)类型的UNSIGNED的属性被标记为过时属性,对于它们的支持在将来的版本中将会被移除,考虑使用一个简单的CHECK约束来代替这钟用法。

SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名

定义在一个整形字段上的SERIAL DEFAULT VALUE是 NOT NULL AUTO_INCREMENT UNIQUE 的别名。

WARNING

当你进行整型之间的减法运算时,如果其中有一个数是UNSIGNED,除非开启了NO_UNSIGNED_SUBTRACTION模式,否则结果也是一个UNSIGNED整数,请查看 第12.11节 类型转换函数和运算

  • BIT[( M )]

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

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

    较小的整数,有符号数的范围是 -128 ~ 127,无符号数的范围是 0 ~ 255 。

  • BOOL, BOOLEAN

    这两种类型是TINYINT(1) 的别名,0认为是false,非零值认为是true:

  1. mysql> SELECT IF(0, 'true', 'false');
  2. +------------------------+
  3. | IF(0, 'true', 'false') |
  4. +------------------------+
  5. | false |
  6. +------------------------+
  7. mysql> SELECT IF(1, 'true', 'false');
  8. +------------------------+
  9. | IF(1, 'true', 'false') |
  10. +------------------------+
  11. | true |
  12. +------------------------+
  13. mysql> SELECT IF(2, 'true', 'false');
  14. +------------------------+
  15. | IF(2, 'true', 'false') |
  16. +------------------------+
  17. | true |
  18. +------------------------+

然而,TRUE和FALSE仅仅分别是1和0的别名,如下所示:

  1. mysql> SELECT IF(0 = FALSE, 'true', 'false');
  2. +--------------------------------+
  3. | IF(0 = FALSE, 'true', 'false') |
  4. +--------------------------------+
  5. | true |
  6. +--------------------------------+
  7. mysql> SELECT IF(1 = TRUE, 'true', 'false');
  8. +-------------------------------+
  9. | IF(1 = TRUE, 'true', 'false') |
  10. +-------------------------------+
  11. | true |
  12. +-------------------------------+
  13. mysql> SELECT IF(2 = TRUE, 'true', 'false');
  14. +-------------------------------+
  15. | IF(2 = TRUE, 'true', 'false') |
  16. +-------------------------------+
  17. | false |
  18. +-------------------------------+
  19. mysql> SELECT IF(2 = FALSE, 'true', 'false');
  20. +--------------------------------+
  21. | IF(2 = FALSE, 'true', 'false') |
  22. +--------------------------------+
  23. | false |
  24. +--------------------------------+

最后两个查询的结果之所以都是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比特位)的无符号整数,如果你使用了超过了9223372036854775807的无符号整数,则运算结果的低位可能由于在把BIGINT转换为DOUBLE时取整而出现误差。

      MySQL可以处理以下几种情形的BIGINT:

      • 在BIGINT字段上利用整数来存储一个较大的无符号数。

      • 在MIN( col_name ) 或 MAX( col_name ), 当 col_name 是一个BIGINT字段时。

      • 当操运算数都是整数时使用运算符(+、-、*等)。

      • 你总是可以在一个BIGINT字段上使用字符串来存储一个精确的整数,在这种使用情况下MySQL会执行string-to-number的转换从而避免双进度数的中间转换形式。

      • 当运算数都是整数时,-、+和*运算符使用BIGINT算术运算。这就意味着两个大数之间的乘积(或返回整数的函数)大于9223372036854775807时,你可能无法得到预期值。

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