Yihui’s Blog

在 MySQL 中存储金额数据,应该使用什么数据类型?

日期:2026-07-11
难度:简单
标签:#面试 #MySQL #DECIMAL #金额 #VIP

一句话答案

金额通常使用 DECIMAL(M,D) 保存精确十进制定点数,或在业务明确最小货币单位时用 BIGINT 保存整数分;不要用 FLOAT、DOUBLE 处理需要精确结算的金额。

面试口语版

金融金额不能容忍二进制浮点误差,所以常用 DECIMAL,例如 DECIMAL(18,2) 表示总共 18 位、其中 2 位小数。若系统统一以“分”为最小单位,也可以用 BIGINT 存整数,计算简单且性能稳定,但要明确币种和小数位,不能把不同币种直接相加。选精度时要覆盖单笔上限、累计金额、税率折扣和中间计算;应用层也要用 BigDecimal 一类精确类型,并统一舍入规则。

原理拆解

方案优点风险/适用边界
DECIMAL直观、精确、支持小数位要设计精度和舍入
BIGINT 最小单位整数运算、约束清晰多币种/不同小数位需元数据
FLOAT/DOUBLE范围大、计算快二进制近似,不适合精确结算

关键细节

  • DECIMAL(18,2) 的 M 是总位数,D 是小数位数。
  • 金额字段还应配币种代码;金额本身不能脱离币种解释。
  • 折扣、汇率、税率往往需要比最终展示金额更多的小数位,最后一步统一舍入。

面试官追问

  1. 为什么 0.1 用 DOUBLE 可能不精确?
  2. DECIMAL(18,2) 最大能存多少?
  3. 多币种如何设计?

高分补充

金额正确性是数据库类型、应用类型、舍入模式、币种和审计链路共同保证的。

学习清单

  • 准备 DECIMAL 与 BIGINT 分单位两套方案的取舍。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文