0

MySQL数据类型—浮点数类型和定点数类型(二十二)

5.1.2  浮点数类型和定点数类型

MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型都可以用(MN)来表示,其中M称为精度,表示总共的位数;N称为标度,是表示小数的位数。【表5.3】列出了MySQL中的小数类型和存储需求。

5.3 MySQL中的小数类型

类型名称

说明

存储需求

FLOAT

单精度浮点数

4 个字节

DOUBLE

双精度浮点数

8个字节

DECIMALM,D),DEC

压缩的“严格定点数

M+2个字节

DECIMAL类型不同于FLOATDECIMAL,其中DECIMAL实际是以串存放的。DECIMAL可能的最大取值范围与DOUBLE一样,但是其有效的取值范围由MD的值决定。如果改变M而固定D,则其取值范围将随M的变大而变大。从表中可以看到DECIMAL的存储空间并不是固定的,而由其精度值M决定,占用M+2个字节。

FLOAT类型的取值范围如下:

有符号的取值范围:-3.402823466E+38-1.175494351E-38

无符号的取值范围:01.175494351E-383.402823466E+38

DOUBLE类型的取值范围如下:

有符号的取值范围:-1.7976931348623157E+308-2.2250738585072014E-308

无符号的取值范围:02.2250738585072014E-308 1.7976931348623157E+308


 

【例5.2】创建表tmp2,其中字段xyzmn数据类型依次为FLOAT(5,1)DOUBLE(5,1)DECIMAL(5,1),向表中插入数据5.125.155.123SQL语句如下:

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)

可以看到FLOATDOUBLE在进行四舍五入时没有给出警告,而给出c字段数值被截断的警告。查看结果:

mysql> SELECT * FROM tmp2;

+------+------+------+

| x    | y   | z   |

+------+------+------+

|  5.1 |  5.2 |  5.1 |

+------+------+------+

FloatDouble在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),decimal如不指定精度默认为(10,0)

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。