MySQL中金额存储用DECIMAL类型还是BIGINT类型

MySQL 4.1以前的版本使用浮点运算实现DECIMAL的计算,这样会因为精度损失导致结果很奇怪。
MySQL 5.0之后DECIMAL类型支持精确计算了。

但是,归根结底,DECIMAL类型只是一个存储类型。

因为CPU是不支持DECIMAL的直接计算,CPU本身是直接支持原生浮点计算,浮点计算的速度更快。

但在MySQL5.0以后的版本中MySQL服务器本身实现了DECIMAL的高精度计算。

MySQL 5.0以后的版本中,是将数字打包保存到一个二进制字符串中(每4个字节保存9个数字)
例如:
DECIMAL(18,9) = 9个小数点前数字+9个小数点后数字+小数点本身 = 4个字节+4个字节+1个字节 = 9个字节
MySQL 5.0以后的版本中DECIMAL类型允许最多65个数字。
例如:
DECIMAL(M,N) 中M的取值范围是:1-65,而在早期版本中范围是:1-254,早期版本不会使用这么大的数字,且DECIMAL只是一种存储格式,计算的时候会被转换成DOUBLE类型计算。这样会丢失计算精度。

浮点类型在存储同样的范围时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节,DOUBLE使用8个字节。

所以:
只有在对小数进行精确计算的时候才是用DECIMAL类型。
在数据量比较大的时候,可以考虑使用BIGINT类型代替DECIMAL类型,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。假设要存储财务数据精确到万分之一,可以把所有金额乘以一百万,然后将结果存储在BIGINT里。这样可以同时避免浮点存储计算不精确和DECIMAL精确计算代价高的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值