
本文共 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 开始,FLOAT
、DOUBLE
和DECIMAL
类型(以及任何同义词),弃用了UNSIGNED
属性;在未来的 MySQL 版本中,应该会删除对它的支持。考虑对这样的列使用一个简单的CHECK
约束。
SERIAL
是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的一个别名。
在整数列的定义中,SERIAL DEFAULT VALUE
是NOT 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 |+------------------------+
然而,值TRUE
和FALSE
分别只是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]
一个小整数。有符号的范围是-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
。
SERIAL
是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
的一个别名。
关于BIGINT
列,你应该注意以下几点:
- 所有的算术运算都使用有符号的
BIGINT
或DOUBLE
值,所以你不应该使用大于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
字面量的文本长度也有限制,参见 。)
如果指定了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-38
,0
,1.175494351E-38 ~ 3.402823466E+38
。这些是基于 IEEE 标准的理论限制。根据硬件或操作系统的不同,实际范围可能会稍微小一些。
M
是总位数,D
是小数点后的位数。如果省略M
和D
,值将存储在硬件允许的范围内。单精度浮点数精确到小数点后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
。如果p
从0
到24
,数据类型变成没有M
或D
值的FLOAT
。如果p
从25
到53
,数据类型变成没有M
或D
值的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-308
,0
,2.2250738585072014E-308 ~ 1.7976931348623157E+308
。这些是基于 IEEE 标准的理论限制。根据硬件或操作系统的不同,实际范围可能会稍微小一些。
M
是总位数,D
是小数点后的位数。如果省略M
和D
,值将存储在硬件允许的范围内。双精度浮点数精确到小数点后大约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
的同义词。
发表评论
最新留言
关于作者
