11.1.1 数值数据类型语法


官方文档地址: 11.1.1 Numeric Data Type Syntax


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

对于浮点和定点数据类型,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模式。参见 12.11 强制转换函数和操作符

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字面量的文本长度也有限制,参见 12.25.3 异常处理。)

如果指定了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 中的所有计算都是用双精度完成的。参见 B.3.4.7 解决没有匹配行的问题

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的同义词。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值