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数据类型 - 数字类型 - 数字类型语法的主要内容,如果未能解决你的问题,请参考以下文章