在 MySQL 中存储金额数据,应该使用什么数据类型?
在 MySQL 中存储金额数据,应该使用什么数据类型?
回答重点
在数据库中业界常用两种类型来存储金额:bigint 和 decimal。
1)bigint 代码中用 long。
- 范围:可以存储的整数范围为 -2^63 到 2^63 - 1(在 MySQL 中为 64 位有符号整数)
- 存储空间:占用 8 字节(64 位)
- 精度:精确存储整数,但不支持小数部分,存储的金额单位是分
2)decimal 代码中使用 BigDecimal。
- 范围:可以存储的数字范围和小数位数由定义的精度和标度决定
- 存储空间:存储空间取决于定义的精度和标度,存储较大数值时会占用更多空间
- 精度:支持高精度的小数运算,精确存储定点数,一般用 decimal(18,6),18 是总位数,6 是小数
扩展知识
项目中到底选择 Long 还是 BigDecimal?
long 类型保存到分,使得小数位(厘)的数据不好处理(需要手动处理,比较麻烦),因此精度不够高。
在高精度金额计算场景下不合适,例如有些三方支付系统是需要抽成的,例如千分之三、万分之一等等,这类的抽成要求精度比较高,例如 会得到 1234.5678 这样的金额,乘以 100 后仍然无法存储为精确整数,还是小数,存储则会丢失精度。
0.0078 看似很少,但抽成的笔数一多,比如一天 30 万笔,每笔少个 0.0078,每天的差额也得 2340 元!一年不得 85 万!
所以高精度的计算不推荐使用 bigint。
BigDecimal 则很适用于高精度金额场景,且非常灵活,只不过相对于 long 性能会差一些,但是在大部分业务上我个人认为可以忽略这个性能问题,除非是特殊场景要求极端性能,所以一般情况下我推荐使用 BigDecimal。
Comments