MySQL数据类型 - 数字类型 - 数字类型语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型 - 数字类型 - 数字类型语法相关的知识,希望对你有一定的参考价值。

原创 林员外 数据库杂货铺 6月22日
mysql支持多种类型的SQL数据类型:数字类型、日期和时间类型、字符串(字符和字节)类型、空间类型和JSON数据类型。我们将分别对各个类型进行详细介绍。

数据类型描述使用以下约定:

●对于整数类型,M表示最大显示宽度。对于浮点和定点类型,M是可以存储的总位数(精度)。对于字符串类型,M是最大长度。M的最大允许值取决于数据类型。

●D适用于浮点和定点类型,表示小数点(刻度)后的位数。最大可能值为30,但不应大于M-2。

●fsp适用于时间、日期时间和时间戳类型(TIME,DATETIME,TIMESTAMP),表示小数秒精度;也就是说,小数点后的位数表示秒的小数部分。fsp值(如果给定)必须在0到6的范围内。值为0表示不存在小数部分。如果省略,则默认精度为0。(这与标准的SQL默认值6不同,因为要和以前的MySQL版本兼容。)

●方括号([和])表示类型定义的可选部分。

1.数字类型

1.1 概要

MySQL支持所有标准的SQL数值数据类型。这些类型包括精确值数字类型(INTEGER、SMALLINT、DECIMAL和NUMERIC)以及近似值数字类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC和FIXED是DECIMAL的同义词。MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准变体)的同义词,除非启用了REAL_AS_FLOAT SQL模式。

位(BIT)数据类型存储位值,并支持MyISAM、MEMORY、InnoDB和NDB表。

1.2 数字数据类型语法

对于整数数据类型,M表示最大显示宽度。最大显示宽度为255。显示宽度与类型可以存储的值范围无关。
对于浮点和定点数据类型,M是可以存储的总位数。
从MySQL 8.0.17开始,整数数据类型不推荐使用显示宽度属性,在以后的MySQL版本中将删除对它的支持。
如果为数字列指定ZEROFILL,MySQL会自动向该列添加UNSIGNED属性。
从MySQL 8.0.17开始,数字类型不推荐使用ZEROFILL属性,在未来的MySQL版本中将删除对它的支持。请考虑使用其他方法来替代。例如,应用程序可以使用LPAD() 函数,或者将格式化的数字存储在CHAR列。

从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 的别称。

●BIT[(M)]

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

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

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

● BOOL, BOOLEAN

这些类型是TINYINT(1)的同义词。零值被认为是false,非零值视为true:
技术图片

然而,TRUE 和 FALSE仅仅是 1 和 0 的别名:

技术图片

最后两个语句显示的结果证明了这一点,因为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位)的无符号大整数!如果这样做,则结果中的某些最后数字可能是错误的,因为在将BIGINT值转换为DOUBLE时会出现舍入错误。

在以下情况下,MySQL可以处理BIGINT:
1)在BIGINT列中存储大的无符号整数值时。
2)在MIN(col_name) 或MAX(col_name)中,col_name指的是BIGINT列。
3)当使用两个操作数都是整数的运算符(+、-、*等)时。

② 通过字符串存储精确的BIGINT列的整数值。在这种情况下,MySQL执行一个字符串到数字的转换,不涉及中间的双精度表示。

③ 当两个操作数都是整数值时-、+和*运算符使用BIGINT进行算术运算。这意味着,如果将两个大整数相乘(或由返回整数的函数产生的结果),当结果大于9223372036854775807时,可能会得到意外的结果。

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

一个“精确”定点数。M是总位数(精度),D是小数点后的位数。小数点和(对于负数)-号不算在M中。如果D为0,则值没有小数点和小数部分。DECIMAL 的最大位数(M)是65。支持的小数(D)的最大数目为30。如果省略D,则默认值为0。如果省略M,则默认值为10。

如果指定了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,则数据类型变为FLOAT,没有M或D值。如果p取值范围在25到53,则数据类型变为DOUBLE,没有M或D值。结果列的范围与本节前面描述的单精度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。

官方文档请参考:https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html

以上是关于MySQL数据类型 - 数字类型 - 数字类型语法的主要内容,如果未能解决你的问题,请参考以下文章

mysql 数字类型的长度区别

MySQL的数据类型

错误:数字类型 (SQL) 的输入语法无效

MySQL数据类型之数字相关

mysql使用where条件数字类型被强转

JavaScript学习笔记——JavaScript语法之数据类型