MySQL小数类型(FLOAT、DOUBLE和DECIMAL)
MySQL 中使用浮点数和定点数来表示小数。
下表列出了 MySQL 中的小数类型和存储需求。
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 语句如下:
- 浮点数类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。
- 定点数类型只有 DECIMAL,定点数类型都可以用 (M,N) 来表示,其中:M 称为精度,表示总共的位数;N 称为标度,表示小数的位数。
下表列出了 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 类型的取值范围如下:
- 有符号的取值范围:-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。
【示例】 创建表 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 | +------+------+------+