数据库-列的类型-浮点数,定点数-数据类型

文章讲述了在SQL中,不同浮点类型(FLOAT4,DOUBLE8,DECIMAL)在存储数值时对小数位数的处理,以及指定精度的重要性。指出在创建表时指定浮点类型精度的警告,并展示了如何通过指定精度来解决存储限制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类型占用空间负数取值范围正数取值范围
FLOAT4 字节-3.4 x 10^383.4 x 10^38
DOUBLE8 字节-1.8 x 10^3081.8 x 10^308
DECIMAL(M,d)M+2-1.8 x 10^3081.8 x 10^308

M表示数字的总位数,而d表示小数点后的位数
d不能大于m;

创建表 不指定精度

# 创建表 
create table FloatTypes(F1 float,d1 double, de decimal);
# 插入整数部分1位,小数部分的21位
insert into floatTypes values(1.1111111111111111111111,1.111111111111111111111,1.1111111111111111111);
select *from floattypes;
/*
+---------+--------------------+------+
| F1      | d1                 | de   |
+---------+--------------------+------+
| 1.11111 | 1.1111111111111112 |    1 |
+---------+--------------------+------+
f1 保存不了21位小数部分因为空间限制 float 4个字节  保存5位
d1 保存不了21位小数部分 8个字节  保存16位
de 好像更加严重 只显示整数部分 这..... 
这要是换成 金钱 得损失 .... 

那怎么办呢  其实 可以指定精度 只对于 decimal 开放  对于 float 和 double 而言 不需要 指定精度 
当然硬要指定精度 但float 和double  说:我是演员
*/

创建表 指定精度和标度

#浮点类型带精度和标度 
create table  floatTypesWithPrecAndScale(F1 float(22,21),d1 double(22,21), de decimal(22,21));

#创建floatTypesWithPrecAndScale时候 有两个警告
#查看警告
show warnings;
/*
+---------+------+------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                          |
+---------+------+------------------------------------------------------------------------------------------------------------------+
| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. |
| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. |
+---------+------+------------------------------------------------------------------------------------------------------------------+

+---------+------+------------------------------------------------------------------------------------------------------------------+
|等级|代码|消息|
+---------+------+------------------------------------------------------------------------------------------------------------------+
|警告| 1681 |指定浮点数据类型的位数已弃用,并将在未来版本中删除。|
|警告| 1681 |指定浮点数据类型的位数已弃用,并将在未来版本中删除。|
+---------+------+------------------------------------------------------------------------------------------------------------------+
F1 float(22,21),d1 double(22,21)  指定位数弃用
*/
#插入数据 1.1111111111111111111111
insert into floatTypesWithPrecAndScale values(1.1111111111111111111111,1.1111111111111111111111,1.1111111111111111111111);
select *from floatTypesWithPrecAndScale;

/*
+-------------------------+-------------------------+-------------------------+
| F1                      | d1                      | de                      |
+-------------------------+-------------------------+-------------------------+
| 1.111111164093017600000 | 1.111111111111111200000 | 1.111111111111111111111 |
+-------------------------+-------------------------+-------------------------+
1 row in set (0.00 sec)

你会发现这个是f1 是我们指定的21位?  所以f1是演员 本来就保存不了 21位 你让我保存 保存不了 我没有这个能力保存  (范大将军 ,我又来了)
d1也是 保存不了的
而这个de真正保存 了数据  真正的 ‘牛肉面’ 而且里面真的‘牛肉’而且是真材实料的‘铁牛牛肉面’ 

de decimal(22,21) m:最多指定65位 d:最多指定30位 decimal(65,30) 

*/

插入的位数比创建表时指定的位数要多时会按照四舍五入的规则进行插入

*/
create table  floatTypesWithPrecAndScale1(F1 float(22,2),d1 double(22,2), de decimal(22,2));

insert into floatTypesWithPrecAndScale1 values(1.7777777777777777,1.77777777777777777777,1.77777777777777777);

select *from floatTypesWithPrecAndScale1;
/*
+------+------+------+
| F1   | d1   | de   |
+------+------+------+
| 1.78 | 1.78 | 1.78 |
+------+------+------+
1 row in set (0.00 sec)
*/
insert into floatTypesWithPrecAndScale1 values(1.74444444444444444444444444444444,1.7444444444444444444444444444444444444,1.7444444444444444444444444444444444444);
 select *from floatTypesWithPrecAndScale1;
/*
+------+------+------+
| F1   | d1   | de   |
+------+------+------+
| 1.78 | 1.78 | 1.78 |
| 1.74 | 1.74 | 1.74 |
+------+------+------+
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小森程序员

若能帮助到你,小费自愿付费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值