5.1.2 浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型都可以用(M,N)来表示,其中M称为精度,表示总共的位数;N称为标度,是表示小数的位数。【表5.3】列出了MySQL中的小数类型和存储需求。
表5.3 MySQL中的小数类型
类型名称 |
说明 |
存储需求 |
FLOAT |
单精度浮点数 |
4 个字节 |
DOUBLE |
双精度浮点数 |
8个字节 |
DECIMAL(M,D),DEC |
压缩的“严格”定点数 |
M+2个字节 |
DECIMAL类型不同于FLOAT和DECIMAL,其中DECIMAL实际是以串存放的。DECIMAL可能的最大取值范围与DOUBLE一样,但是其有效的取值范围由M和D的值决定。如果改变M而固定D,则其取值范围将随M的变大而变大。从表中可以看到DECIMAL的存储空间并不是固定的,而由其精度值M决定,占用M+2个字节。
FLOAT类型的取值范围如下:
⑴ 有符号的取值范围:-3.402823466E+38到-1.175494351E-38。
⑵ 无符号的取值范围:0和1.175494351E-38到3.402823466E+38。
DOUBLE类型的取值范围如下:
⑴ 有符号的取值范围:-1.7976931348623157E+308到-2.2250738585072014E-308。
⑵ 无符号的取值范围:0和2.2250738585072014E-308到 1.7976931348623157E+308。
【例5.2】创建表tmp2,其中字段x,y,z,m,n数据类型依次为FLOAT(5,1)、DOUBLE(5,1)和DECIMAL(5,1),向表中插入数据5.12、5.15和5.123,SQL语句如下:
CREATE TABLE tmp2 ( x FLOAT(5,1), y DOUBLE(5,1), z DECIMAL(5,1) );
向表中插入数据:
mysql>INSERT INTO tmp2 VALUES(5.12, 5.15, 5.123);
Query OK, 1 row affected, 1 warning (0.00 sec)
可以看到在插入数据时,MySQL给出了一个警告信息,使用SHOW WARNINGS;语句查看警告信息:
mysql> SHOW WARNINGS;
+-------+------+-----------------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------------+
| Note | 1265 | Data truncated for column 'z' at row 1 |
+-------+------+------------------------------------------------+
1 row in set (0.00 sec)
可以看到FLOAT和DOUBLE在进行四舍五入时没有给出警告,而给出c字段数值被截断的警告。查看结果:
mysql> SELECT * FROM tmp2;
+------+------+------+
| x | y | z |
+------+------+------+
| 5.1 | 5.2 | 5.1 |
+------+------+------+
Float和Double在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),decimal如不指定精度默认为(10,0)。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。