1、数值数据类型
1.1 整数类型(精确值)
INTEGER
, INT
, SMALLINT
, TINYINT
, MEDIUMINT
, BIGINT
MySQL支持SQL标准的整数类型INTEGER
(或INT
)和SMALLINT
。作为标准的扩展,MySQL还支持整数类型TINYINT
、MEDIUMINT
和BIGINT
。下表显示了每种整数类型所需的存储和范围。
1.2 定点类型(精确值)
DECIMAL
, NUMERIC
DECIMAL
和NUMERIC
类型存储精确的数值数据值。当需要保持精确的精确度(exact precision)时,例如货币数据,就会使用这些类型。在MySQL中,NUMERIC
被实现为DECIMAL
,因此下面关于DECIMAL
的说明同样适用于NUMERIC
。
在DECIMAL
列声明中,可以(通常是)指定精度和比例。例如:
salary DECIMAL(5,2)
在本例中,5是精度(precision
),2是刻度(scale
)。精度表示为值存储的有效位数(significant digits
),刻度表示可以在小数点后存储的位数。
标准SQL要求DECIMAL(5,2)
能够存储5位数字和2位小数的任何值,因此可以存储在salary列中的值范围为-999.99到999.99。
在标准SQL中,DECIMAL(M)
语法等价于DECIMAL(M,0)
。类似地,DECIMAL
语法等价于DECIMAL(M,0)
,其中允许实现决定M的值。MySQL支持这两种不同形式的DECIMAL语法。M的缺省值为10。
如果刻度为0,则DECIMAL值不包含小数点或小数部分。
DECIMAL的最大位数是65,但是给定DECIMAL
列的实际范围可以受到给定列的精度或scale 的限制。如果为此类列分配的值的小数点后的数字多于指定刻度所允许的数字,则该值将转换为该刻度。(精确的行为是特定于操作系统的,但通常效果是截断到允许的位数。)
1.3 浮点类型(近似值)
FLOAT
, DOUBLE
FLOAT
和DOUBLE
类型表示近似的数值数据值。MySQL使用4个字节作为单精度值,8个字节用于双精度值。
对于FLOAT
, SQL标准允许精度(precision )的可选规范(但不允许指数(exponent)的范围)在关键字FLOAT
后面的括号中,即FLOAT(p)
。MySQL也支持这个可选的精度规范,但FLOAT§中的精度值仅用于确定存储大小。精度从0到23会产生一个4字节的单精度FLOAT
列。精度从24到53会产生一个8字节的双精度DOUBLE
列。
MySQL允许使用非标准语法:FLOAT(M,D)
或REAL(M,D)
或DOUBLE PRECISION(M,D)
。这里,(M,D)
表示这些值总共可以存储M
位,其中可以在小数点后D
位。例如,定义为FLOAT(7,4)
的列显示为-999.9999。MySQL在存储值时执行舍入,因此如果将999.00009插入FLOAT(7,4)列,近似结果为999.0001。
从MySQL 8.0.17开始,非标准的FLOAT(M,D)和DOUBLE(M,D)语法已经弃用,你应该可以期待在MySQL的未来版本中对它的支持被移除。
由于浮点值是近似值,而不是存储为精确值,因此在比较中试图将它们视为精确值可能会导致问题。它们还受平台或实现依赖关系的制约。有关更多信息,请参见B.3.4.8节“浮点值的问题”。
为了获得最大的可移植性,需要存储近似数值数据值的代码应该使用FLOAT
或DOUBLE PRECISION
,而不需要指定精度或位数。