11.1.1 数值数据类型语法
发布日期:2021-05-08 00:27:58 浏览次数:22 分类:原创文章

本文共 5230 字,大约阅读时间需要 17 分钟。



文章目录



















官方文档地址:




对于整数数据类型,M表示最大显示宽度。最大显示宽度为255。显示宽度与一个数据类型可以存储的值范围无关,参见 。


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


从 MySQL 8.0.17 开始,整型数据类型弃用了显示宽度属性;在未来的 MySQL 版本中,应该会删除对它的支持。


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


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


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


从 MySQL 8.0.17 开始,FLOATDOUBLEDECIMAL类型(以及任何同义词),弃用了UNSIGNED属性;在未来的 MySQL 版本中,应该会删除对它的支持。考虑对这样的列使用一个简单的CHECK约束。


SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。


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



警告

当你在类型为UNSIGNED的整数值之间使用减法时,结果是无符号的,除非启用了NO_UNSIGNED_SUBTRACTION SQL模式。参见 。



BIT[(M)]


一个位值的类型。M表示每个值的位数,取值范围是1 ~ 64。如果省略M,默认值为1


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


一个很小的整数。有符号范围是-128 ~ 127。无符号取值范围是0 ~ 255


TINYINT(1)的同义词:



  • BOOL

  • BOOLEAN


零值被认为是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]


一个小整数。有符号的范围是-32768 ~ 32767。无符号范围是0 ~ 65535


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


一个中等大小的整数。有符号的范围是-8388608 ~ 8388607。无符号范围是0 ~ 16777215


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


一个普通大小的整数。有符号的范围是-2147483648 ~ 2147483647。无符号范围是0 ~ 4294967295


同义词:INTEGER[(M)] [UNSIGNED] [ZEROFILL]


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


一个大整数。有符号的范围是-9223372036854775808 ~ 9223372036854775807。无符号范围是0 ~ 18446744073709551615


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中。如果D0,则数值没有小数点和小数部分。DECIMAL的最大位数(M)65。支持的小数(D)的最大数目是30。如果省略D,则默认值为0。如果省略M,则默认值为10。(对于DECIMAL字面量的文本长度也有限制,参见 。)


如果指定了UNSIGNED,则禁止使用负值。从 MySQL 8.0.17 开始,DECIMAL类型(以及任何同义词),弃用了UNSIGNED属性;在未来的 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-3801.175494351E-38 ~ 3.402823466E+38。这些是基于 IEEE 标准的理论限制。根据硬件或操作系统的不同,实际范围可能会稍微小一些。


M是总位数,D是小数点后的位数。如果省略MD,值将存储在硬件允许的范围内。单精度浮点数精确到小数点后7位左右。


FLOAT(M,D)是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,这个语法已被弃用,在未来的 MySQL 版本中,应该会删除对它的支持。


如果指定了UNSIGNED,则禁止使用负值。从 MySQL 8.0.17 开始,对于FLOAT类型的列(以及任何同义词),UNSIGNED属性已被弃用,在未来的 MySQL 版本中,应该会删除对它的支持。考虑对这样的列使用一个简单的CHECK约束。


使用FLOAT可能会带来一些意想不到的问题,因为 MySQL 中的所有计算都是用双精度完成的。参见 。


FLOAT(p) [UNSIGNED] [ZEROFILL]


一个浮点数。p表示以位为单位的精度,但是 MySQL 使用这个值只是为了决定结果数据类型是使用FLOAT还是DOUBLE。如果p024,数据类型变成没有MD值的FLOAT。如果p2553,数据类型变成没有MD值的DOUBLE。结果列的范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。


如果指定了UNSIGNED,则禁止使用负值。从 MySQL 8.0.17 开始,对于FLOAT类型的列(以及任何同义词),UNSIGNED属性已被弃用,在未来的 MySQL 版本中,应该会删除对它的支持。考虑对这样的列使用一个简单的CHECK约束。


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


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


普通大小(双精度)浮点数。允许值为-1.7976931348623157E+308 ~ 2.2250738585072014E-30802.2250738585072014E-308 ~ 1.7976931348623157E+308。这些是基于 IEEE 标准的理论限制。根据硬件或操作系统的不同,实际范围可能会稍微小一些。


M是总位数,D是小数点后的位数。如果省略MD,值将存储在硬件允许的范围内。双精度浮点数精确到小数点后大约15位。


DOUBLE(M,D)是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,这个语法已被弃用,在未来的 MySQL 版本中,应该会删除对它的支持。


如果指定了UNSIGNED,则禁止使用负值。从 MySQL 8.0.17 开始,对于DOUBLE类型的列(以及任何同义词),UNSIGNED属性已被弃用,在未来的 MySQL 版本中,应该会删除对它的支持。考虑对这样的列使用一个简单的CHECK约束。


同义词:



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

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


这些类型是DOUBLE的同义词。异常:如果启用了REAL_AS_FLOAT SQL模式,REAL就是FLOAT的同义词,而不是DOUBLE的同义词。

上一篇:11.1.3 定点类型(精确值)- DECIMAL,NUMERIC
下一篇:附录 B 错误信息和常见问题

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月27日 04时27分12秒