MySQL中的小数类型(附带实例)
MySQL 中使用浮点数和定点数来表示小数:
定点数类型都可以用 (M,N) 来表示。其中,M 称为精度,表示总共的位数;N 称为标度,表示小数的位数。
下表列出了 MySQL 中的小数类型和存储需求。
DECIMAL 类型不同于 FLOAT 和 DOUBLE,它实际是以串存放的,可能的最大取值范围与 DOUBLE 一样,但其有效的取值范围由 M 和 D 的值决定。如果改变 M 而固定 D,则其取值范围将随 M 的变大而变大。
从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由其精度值 M 决定的,其占用 M+2 字节。
FLOAT 类型的取值范围如下:
DOUBLE 类型的取值范围如下:
【实例】创建表 tmp2,其中字段 x、y、z 的数据类型依次为 FLOAT、DOUBLE 和 DECIMAL(5,1),SQL 语句如下:
向表中插入数据 5.12、5.15 和 5.123,SQL 语句如下:
在插入数据时,MySQL 给出了一个警告信息,使用 SHOW WARNINGS;语句查看警告信息:
- 浮点数类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE);
- 定点数类型只有一种:DECIMAL。
定点数类型都可以用 (M,N) 来表示。其中,M 称为精度,表示总共的位数;N 称为标度,表示小数的位数。
下表列出了 MySQL 中的小数类型和存储需求。
类型名称 | 说明 | 存储需求 |
---|---|---|
FLOAT | 单精度浮点数 | 4 字节 |
DOUBLE | 双精度浮点数 | 8 字节 |
DECIMAL(M,D), DEC | 压缩的“严格”定点数 | M+2 字节 |
DECIMAL 类型不同于 FLOAT 和 DOUBLE,它实际是以串存放的,可能的最大取值范围与 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。
【实例】创建表 tmp2,其中字段 x、y、z 的数据类型依次为 FLOAT、DOUBLE 和 DECIMAL(5,1),SQL 语句如下:
CREATE TABLE tmp2 ( x FLOAT, y DOUBLE, z DECIMAL(5,1) );
向表中插入数据 5.12、5.15 和 5.123,SQL 语句如下:
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 字段数值被截断的警告。使用 SELECT * FROM tmp2 语句查看数据输入结果,结果如下:
mysql> SELECT * FROM tmp2; +----+----+----+ | x | y | z | +----+----+----+ | 5.1| 5.2| 5.1| +----+----+----+