首页 >> 基础教程

记录货币用什么类型比较好?

   在MySQL中存储货币值时,推荐使用 DECIMAL 类型,原因如下:

1. 为什么用 DECIMAL

  • 精确性:货币计算需要绝对避免浮点数误差(如 FLOAT/DOUBLE 因二进制表示可能导致舍入错误)。

  • 定点数特性DECIMAL 以字符串形式存储数字,确保十进制运算精确,适合财务计算。

  • 灵活精度:可自定义整数和小数部分的位数(如 DECIMAL(10, 2) 表示整数部分最多8位,小数部分固定2位)。

2. 定义方式示例

price 总位数10位(含小数),小数占2位(如 12345678.99)

    id INT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10, 2));

3. 其他类型的缺点

  • FLOAT/DOUBLE
    二进制浮点数无法精确表示十进制小数(如 0.1),导致累计误差,不推荐用于货币

  • INT/BIGINT
    需将货币转为最小单位存储(如“元”转为“分”),代码复杂且易出错。仅在高性能整数运算场景考虑(仍需谨慎)。

  • VARCHAR
    无法直接参与数学运算,需转换且效率低,禁止使用

4. 一些建议

  • 精度选择

    • 通用场景:DECIMAL(10, 2)(最大到千万级,精确到分)。

    • 大额金融:DECIMAL(20, 2)(如万亿级交易)。

  • 计算时的注意
    使用 ROUND() 函数避免中间结果误差(如 ROUND(price * quantity, 2))。

  • 无符号选项
    若金额永不为负,可加 UNSIGNEDDECIMAL(10, 2) UNSIGNED

总结

类型是否推荐原因
DECIMAL✅ 强烈推荐精确、无误差、直接表示金额
FLOAT/DOUBLE❌ 禁止浮点精度损失导致财务错误
INT/BIGINT⚠️ 特殊情况需代码转换单位,维护复杂
VARCHAR❌ 禁止无法计算,效率低下

总的来说,始终优先使用 DECIMAL,确保财务数据的准确性和可靠性。当然也有一些例外,比如确定精度只到小数点后2位,那么也可以用INT/BIGINT,原数据*100转换成没有小数的单位。


最新文章
InnoDB 和 MyISAM 主要有什么区别?2025-07-06
mysql存储引擎应该怎么选择?2025-07-06
mysql的几种存储引擎2025-07-06
MySQL 的段区页行2025-07-06
一条更新语句是如何执行的?2025-07-06
mysql中一条查询语句是如何执行的?2025-07-02
MySQL基础架构及执行流程解析2025-07-02
MySQL SQL语法树解析过程详解2025-07-02
mysql中SQL 的隐式数据类型转换?2025-07-01
MySQL 第 3-10 条记录怎么查?2025-06-30
备案号:蜀ICP备2023042032号-1