mysql8 数据类型 float double decimal
2019-06-08 本文已影响0人
一生悬命Cat
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
做以下实验:
先建表
create table test1 (
f float(5,2) default null,
d double(5,2) default null,
de decimal(5,2) default null);
Query OK, 0 rows affected (0.04 sec)
desc test1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| f | float(5,2) | YES | | NULL | |
| d | double(5,2) | YES | | NULL | |
| de | decimal(5,2) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
测试
mysql> insert into test1 values
(1.23,1.23,1.23),
(1.234,1.234,1.234) ;
Query OK, 2 rows affected, 1 warning (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from test1;
+------+------+------+
| f | d | de |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
+------+------+------+
2 rows in set (0.00 sec)
数据插入都正确,但是f和d由于标度的限制,舍去了最后一位。
de由于标度限制,舍去了最后一位,出现警告.
这一次我们把精度和标度 全部去掉,再做实验
alter table test1 modify f float;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
alter table test1 modify d double;
Query OK, 2 rows affected (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 0
alter table test1 modify de decimal;
Query OK, 2 rows affected, 2 warnings (0.07 sec)
Records: 2 Duplicates: 0 Warnings: 2
(decimal去掉精度与标度会出现警告);
truncate table test1; //清空表
insert into test1 values(1.23,1.23,1.23);
Query OK, 1 row affected, 1 warning (0.01 sec)
会出现这种情况
select * from test1;
+------+--------------------+------+
| f | d | de |
+------+--------------------+------+
| 1.23 | 1.23 | 1 |
+------+--------------------+------+
3 rows in set (0.00 sec)
浮点数如果不写精度和标度,则会按照实际显示,
如果有精度和标度,则会将数据四舍五入后插入,
系统不报错,定点数如果不设置精度和标度,
刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会警告!
做运算
mysql> truncate table test1;
Query OK, 0 rows affected (0.04 sec)
mysql> insert test1 values
(1.213,1.456,1.678),(1.4567,1.5678,1.6578),(0.1,0.001,1);
Query OK, 3 rows affected, 2 warnings (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 2
mysql> select * from test1;
+--------+--------+------+
| f | d | de |
+--------+--------+------+
| 1.213 | 1.456 | 1.68 |
| 1.4567 | 1.5678 | 1.66 |
| 0.1 | 0.001 | 1.00 |
+--------+--------+------+
3 rows in set (0.00 sec)
mysql> select sum(f),sum(d),sum(de) from test1;
+-------------------+--------+---------+
| sum(f) | sum(d) | sum(de) |
+-------------------+--------+---------+
| 2.769700028002262 | 3.0248 | 4.34 |
+-------------------+--------+---------+
1 row in set (0.00 sec)
与mysql5.7有点不同,
5.7的f 、d 都保留了很大串的小数,
mysql8的 d 精度有所提高