在 MySQL 中存储金额数据时,推荐使用 DECIMAL 数据类型。这是金融领域和精确数值计算的行业标准选择,原因如下:
-
精确性保障
DECIMAL 是定点数类型,可避免浮点型(FLOAT/DOUBLE)的二进制舍入误差。例如:DECIMAL(10, 2) -- 总长度10位,小数部分固定2位(如 12345678.90)
-
参数规范建议
- 整数部分长度需覆盖业务最大值(如
DECIMAL(13,2)
支持千亿级金额) - 小数位数根据业务需求定义(常见为2位对应分币单位)
- 整数部分长度需覆盖业务最大值(如
-
替代方案对比
数据类型 优点 缺点 FLOAT/DOUBLE 存储空间小 存在精度丢失风险 INT/BIGINT 避免小数运算 需程序层处理单位转换(如分) -
补充实践建议
- 若涉及多币种,可单独存储
currency_code
字段(如 ISO 4217 标准) - 金额计算应在数据库层完成,避免程序层的精度不一致问题
- 对账场景建议搭配
CHECK
约束限制负数无效值:ALTER TABLE transactions ADD CONSTRAINT chk_amount CHECK (amount >= 0);
- 若涉及多币种,可单独存储
通过 DECIMAL 类型可确保财务数据的严格准确性,符合 ACID 原则及审计要求。