针对 MySQL 数据库,如果要保存金额字段,你会选用哪种数据类型来定义该列?请说明选择理由。
考察说明
考察候选人对 MySQL 数值类型精度与业务需求的匹配能力,尤其是金额场景下避免浮点误差的意识。
回答思路
- 【回答框架 1】金额数据要求精确存储,不能使用 FLOAT 或 DOUBLE,因为它们基于浮点运算,在累加或比较时可能产生精度丢失。MySQL 的 DECIMAL 类型属于定点数,按十进制存储,可保证精确计算,适合金额等对精度敏感的业务字段。
- 【回答框架 2】DECIMAL 定义时需要指定精度(M)和小数位数(D),例如 DECIMAL(10,2) 表示总位数 10 位、小数 2 位。实际业务中应根据金额范围设置足够的总位数,避免溢出。存储空间上 DECIMAL 以字符串形式存储,每 9 位占 4 字节,相比整数类型更占空间,但换取精度是值得的。
- 【回答框架 3】除了类型本身,金额字段还要考虑索引和计算效率。DECIMAL 支持精确比较和计算,适合直接存储金额。若对性能有极致要求,也可以将金额换算成最小单位(如分)用 BIGINT 存储,但这要求应用层统一处理换算,且要注意避免溢出。
- 【关键点 1】使用 DECIMAL 类型,避免 FLOAT/DOUBLE 的精度问题。
- 【关键点 2】定义格式 DECIMAL(M,D),M 为总位数,D 为小数位数,需按业务范围设定。
- 【关键点 3】备选方案是使用 BIGINT 存储最小货币单位(如分),但需应用层换算。
- 【易错点 1】误用 FLOAT 或 DOUBLE 导致精度丢失,特别是在求和、比较时。
- 【易错点 2】DECIMAL 的 M 和 D 设置不当导致溢出或精度不足。