对于小数的表示,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度),double(双精度),而定点数只有decimal一种表示。定点数在MySQL内部以字符串的形式存放,比浮点数更精确,所以适合用来表示货币等精度高的数据。
概念:
浮点数和定点数都可以用类型名称后加“(M,D)”的方式来表示,“(M,D)”表示该值一共显示M为数字(整数+小数位),其中D位位于小数点后面,M和D又称为精度和标度,例如,定义为float(7,4)的一个列可以显示为-999.9999。
MySQL保存值得时候进行四舍五入,如果在float(7,4)列内插入999.00009,近似结果是999.0001。值得注意的是,浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float个double在不指定精度时,默认会按照实际精度(由实际的硬件和操作系统决定)来显示,而decimal在不指定精度的时候,磨人的整数位是10,小数位是0。
实际操作看一下吧:
(1)创建测试表,分别将id1,id2,id3字段设置为float(5.2),double(5,2),decimal(5,2);
CREATE TABLE `t1` (
`id1` float(5,2) NOT NULL,
`id2` double(5,2) NOT NULL,
`id3` decimal(5,2) NOT NULL
)
(2)都插入数据1.23
可以看到数据都正确的插入了
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2UjM4UTMyMTM0AzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(3)再向id1,id2插入数据1.234,而id3依然插入1.23
可以看到,数据都正常插入,但是因为float和double的标度限制,舍去了最后一位,而变成了1.23
(4)同是向三个字段都插入1.234试试呢
结果依然是
此时虽然数据都插入进去,但是如果命令行形式的话会抛出一个Warning,报告id3被截断,如果是在传统的SQLMode,这条记录是无法插入的。
(5)接下来试试吧所有的精度和标度全部取消,再次插入1.23
alter table t1 modify id1 float;
alter table t1 modify id1 double;
alter table t1 modify id1 decimal;
insert into t1 values(1.23,1.23,1.23);
这时候发现id1,id2都正常插入数据,而id3的小数点位被截断。
上面这个例子验证了上面提到的浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动四舍五入插入,系统不会报错,;
而decimal(定位数)如果不写精度,则默认按照decimal(10,0)来进行操作,并且如果超出了精度和标度值,系统会报错。