首页 > 编程笔记

MySQL小数类型(FLOAT、DOUBLE和DECIMAL)

MySQL 中使用浮点数和定点数来表示小数。
下表列出了 MySQL 中的小数类型和存储需求。

表1:MySQL 中的小数类型和存储需求
类型名称 说明 存储需求
FLOAT 单精度浮点数 4字节
DOUBLE 双精度浮点数 8字节
DECIMAL(M,D),DEC 压缩的“严格”定点数 M+2 字节

DECIMAL 类型不同于 FLOAT 和 DOUBLE,DECIMAL 实际是以串存储的,可能的最大取值范围与 DOUBLE 一样,但是其有效的取值范围由 M 和 D 的值决定。如果改变 M 而固定 D,则其取值范围将随 M 的变大而变大。

从表1可以看到,DECIMAL 的存储空间并不是固定的,而由其精度值 M 决定的,占用 M+2 字节。

FLOAT 类型的取值范围如下:
DOUBLE 类型的取值范围如下:
【示例】 创建表 tmp2,其中字段 x、y、z 的数据类型依次为 FLOAT、DOUBLE 和 DECIMAL(5,1),向表中插入数据 5.12、5.15 和 5.123,SQL 语句如下:
CREATE TABLE tmp2 (x FLOAT, y DOUBLE, z DECIMAL(5,1));
向表中插入数据:
mysql>INSERT INTO tmp2 VALUES(5.12, 5.15, 5.123);
可以看到,在插入数据时,MySQL 给出了一个警告信息,使用SHOW WARNINGS;语句查看警告信息:
mysql> SHOW WARNINGS;
+-------+------+----------------------------------------+
| Level | Code | Message                                |
+-------+------+----------------------------------------+
| Note  | 1265 | Data truncated for column 'z' at row 1 |
+-------+------+----------------------------------------+
可以看到,给出了 z 字段数值被截断的警告。结果如下:
mysql> SELECT * FROM tmp2;
+------+------+------+
| x    | y    | z    |
+------+------+------+
| 5.1  |  5.2 |  5.1 |
+------+------+------+

推荐阅读