根据MySQL官方文档,MySQL5.7版本和MySQL8.0版本的数据类型主要分为5种[1,2]。前三种是常用的数据类型。
1.数值型 Numeric Types
2.日期与时间型 Date and Time Types
3.字符串型 String Types
4.空间数据类型Spatial Data Types
5.JSON数据类型
本文介绍的是数值型Numeric Types。
在MySQL中,数值型Numeric Types分为四类[3]:
1.整数类型:INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
2.定点数类型: DECIMAL, NUMERIC
3.浮点数类型: FLOAT, DOUBLE
4.BIT类型:BIT
1.整数类型:INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
表1 MySQL支持的整数类型所需的存储和范围
如TINYINT类型,其存储长度为1字节,即8 Bit。(1字节=8 Bit)1字节(8 Bit)的二进制数,转换为十进制,其最小值为0(二进制00000000,可转换为十进制数0),最大值为255(二进制11111111,可转换为十进制数2^8-1=255),即1字节(8 bit)的二进制数能够表示的十进制数范围在0~255。TINYINT类型,无符号(Unsigned)的最小值为0,最大值为255 (2^8-1) 。带符号(Signed)的最小值为-128(-2^7),最大值为127(2^7-1)。同理,可以推出SMALLINT的无符号(Unsigned)最大值为2^16-1 ,MEDIUMNT的无符号(Unsigned)最大值为2^24-1,INT的无符号(Unsigned)最大值为2^32-1。在MySQL中,可以设置整数类型为带符号(Signed)和无符号(Unsigned),无符号的数值范围从0开始。整数类型默认为带符号(Signed)。在MySQL中,可以定义显示宽度。对于整数类型,m表示最大显示宽度。最大显示宽度是255。显示宽度与类型可以包含的值的范围无关。定义INT(默认为带符号Signed)的显示宽度为4 : INT(4)在INT(4)中依然可以存储带符号INT的数值范围,即注:从MySQL 8.0.17开始,整数数据类型不推荐使用显示宽度属性,该属性将在未来的MySQL版本中删除。相当于tinyint(1)。零值被认为是假False。非零值被认为是真True。2. 定点数类型:DECIMAL, NUMERICDECIMAL和NUMERIC类型存储精确的数值类型的数据值。当保持精确的精度很重要时,例如对于货币数据,建议使用定点数类型。在MySQL中,NUMERIC被实现为DECIMAL,因此下面关于DECIMAL的注释同样适用于NUMERIC。DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
M为存储的总位数(精度),D为小数点后可以存储的数字位数在标准SQL中,DECIMAL(M)相当于DECIMAL(M,0)。类似地,语法DECIMAL相当于DECIMAL (M,0),允许用户设定M的值,MySQL支持这两种不同形式的DECIMAL语法。M的默认值是10。如果D(小数点后的数字位数)= 0,那么DECIMAL值不包含小数点或小数部分。DECIMAL的最大精度为65位。所有带有DECIMAL列的基本计算(+、-、*、/)都是以65位数的精度完成的。对salary列指定数据类型为DECIMAL,存储的总位数(精度precision)为5,小数点后的数字位数为2。在本例中,5是精度(precision),2是小数点后的数字位数(scale)。precision表示为值存储的有效位数,scale表示小数点后可以存储的位数。标准SQL要求DECIMAL(5,2)能够存储任何五位数和两位小数的值,因此可以存储在salary列中的值范围为-999.99到999.99。FLOAT和DOUBLE表示近似(approximate)的数值。MySQL对FLOAT使用4个字节存储,对DOUBLE使用8个字节存储。FLOAT:单精度(single-precision)浮点数。允许值为-3.402823466E+38至-1.175494351E-38、0和1.175494351E-38至3.402823466E+38。这些是基于IEEE标准的理论极限。根据您的硬件或操作系统,实际范围可能会稍小一些。DOUBLE:双精度(double-precision)浮点数。允许值为-1.7976931348623157E+308至-2.2250738585072014E-308、0和2.2250738585072014E-308至1.7976931348623157E+308。这些是基于IEEE标准的理论极限。根据您的硬件或操作系统,实际范围可能会稍小一些。FLOAT(p) [UNSIGNED] [ZEROFILL]
浮点数。p代表以位为单位的精度,精度值p仅用于确定存储大小。MySQL仅使用p值来确定数据类型是使用FLOAT还是DOUBLE。从0到23的精度会产生一个4字节的FLOAT列。从24到53的精度产生一个8字节的DOUBLE列。(M,D)是指总共最多可以存储M位数的数值,小数点后有D位数。例如,MySQL在存储值时会取整,因此如果将999.00009插入FLOAT(7,4),近似结果是999.0001。从MySQL 8.0.17开始,不推荐使用非标准的FLOAT(M,D)和DOUBLE(M,D)语法,对它的支持将在未来的MySQL版本中删除。从MySQL 8.0.17开始,FLOAT类型的列(以及任何同义词)不推荐使用无符号属性,并且在未来的MySQL版本中将删除该属性。因为浮点值是近似的,并不作为精确值存储,所以在比较中试图将它们视为精确值可能会导致问题。它们还受制于平台或实现依赖性[4]。BIT(M)能够存储M bit的数据。M的范围是1到64,如果省略M,则默认M=1。要指定bit的值,可以使用b'value '符号。value是使用0和1编写的二进制值。例如,b'111 '和b'10000000 '分别代表7和128。如果为BIT(M)列分配一个长度小于m位的数值,该值将在左侧填充零。例如,将b'101 '的值分配给BIT(6)列实际上与分配b'000101 '相同。[1] DataTypes.MySQL 8.0 Reference Manual. https://dev.mysql.com/doc/refman/8.0/en/char.html[2] DataTypes.MySQL 5.7 Reference Manual. https://dev.mysql.com/doc/refman/5.7/en/char.html[3] Numeric Type Overview. MySQL 8.0 Reference Manual. https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html[4] Problems with Floating-Point Values. MySQL 8.0 Reference Manual.https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html.