对于货币值来说,最佳的 SQL 数据类型是什么?我正在使用 MySQL,但更喜欢独立于数据库的类型。

有帮助吗?

解决方案

Decimal(19,4)这样的东西在大多数情况下通常效果很好。您可以调整比例和精度,以满足您需要存储的数字的需要。即使在SQL Server中,我也倾向于不使用“ money ”。因为它不标准。

其他提示

您唯一需要注意的是,如果您从一个数据库迁移到另一个数据库,您可能会发现DECIMAL(19,4)和DECIMAL(19,4)意味着不同的东西

http://dev.mysql .com / doc / refman / 5.1 / en / precision-math-decimal-changes.html

    DBASE: 10,5 (10 integer, 5 decimal)
    MYSQL: 15,5 (15 digits, 10 integer (15-5), 5 decimal)

计算出计算所需的小数位数也很重要。

我参与了一项股价申请,要求计算一百万股的价格。报价的股票价格必须保存为7位精确度。

Assaf对

的回应
  

取决于你得到多少钱......

听起来很轻浮,但实际上它是有针对性的。

仅在今天我们遇到了一个问题,即记录未能插入到我们的费率表中,因为其中一列(GrossRate)设置为十进制(11,4),而我们的产品部门刚收到一个房间合同波拉波拉岛上一些令人惊叹的度假胜地,每晚售价数百万太平洋法郎...... 10年前设计数据库架构时从未反映过的东西。

对于会计应用程序,将值存储为整数是非常常见的(有些甚至可以说它只是 方式)。要了解一下,请考虑交易金额(假设为100.23美元)和100,1000,10000等倍数,以获得所需的准确性。因此,如果您只需要存储美分并且可以安全地向上或向下舍入,则只需乘以100.在我的示例中,这将使10023成为要存储的整数。您将节省数据库中的空间,并且比比较两个整数 比比较两个浮点数更容易。我的0.02美元。

超级迟到,但GAAP是一个很好的经验法则。

如果您的申请需要处理高达万亿的金额,那么这应该有效:13,2如果您需要遵守GAAP(公认会计原则),请使用:13,4

通常你应该把你的货币价值加在13,4,然后再将产出四舍五入到13,2。

来源:在MySQL中存储货币价值的最佳数据类型

默认情况下,您可以使用 DECIMAL(19,2)之类的所有货币值,但如果您只存储低于1,000美元的价值,那么这只会是浪费有价值的数据库空间。

对于大多数实现, DECIMAL(N,2)就足够了, N 的值至少是之前的位数。您希望存储在该字段 + 5 中的最大金额。因此,如果您不希望存储任何大于999999.99的值, DECIMAL(11,2)应该绰绰有余(直到期望发生变化)。

如果您想成为 GAAP 兼容,您可以使用 DECIMAL(N,4),其中 N 的值至少是之前的位数。您希望存储在该字段 + 7 中的最大金额。

这取决于数据的性质。你需要事先考虑一下。

我的情况

  • decimal(13,4) 无符号用于记录货币交易
    • 存储效率高(小数点两边各 4 个字节) 1
    • 符合公认会计原则
  • 对于聚合来说,decimal(19,4) 无符号
    • 我们需要更多空间来容纳总计数十亿的交易
    • 半遵守 MS 货币数据类型不会有什么坏处 2
    • 每条记录将占用更多空间(11 个字节 - 7 个左字节和 4 个右字节),但这很好,因为聚合记录较少 1
  • 汇率的小数(10,5)
    • 它们通常总共用 5 位数字引用,因此您可以找到 1.2345 和 12.345 等值,但找不到 12345.67890
    • 这是广泛的惯例,但不是一个成文的标准(至少就我的快速搜索知识而言)
    • 您可以使用相同的存储将其设置为十进制(18,9),但数据类型限制是有价值的内置验证机制

为什么是(M,4)?

  • 有些货币可以分成一千美分
  • 有货币等价物,如“Unidad de Fermento”、“CLF”,用 4 位有效小数表示 3,4
  • 符合公认会计原则

权衡

  • 精度较低:
    • 更少的存储成本
    • 更快的计算
    • 降低计算错误风险
    • 更快的备份和恢复
  • 更高的精度:
    • 未来的兼容性(数量趋于增长)
    • 节省开发时间(满足限制时,您无需重建半个系统)
    • 降低因存储精度不足而导致生产失败的风险

兼容至尊

虽然 MySQL 允许您使用十进制(65,30),但如果我们想保留传输选项,则 31 的小数位数和 30 的精度似乎是我们的限制。

最常见 RDBMS 中的最大规模和精度:

            Precision   Scale
Oracle      31          31
T-SQL       38          38
MySQL       65          30
PostgreSQL  131072      16383

6, 7, 8, 9

合理的极端

  1. 为什么是(27,4)?
    • 你永远不知道系统什么时候需要存储津巴布韦元

2015年9月津巴布韦政府表示将以1美元兑换35万亿津巴布韦元的汇率将津巴布韦元兑换成美元 5

我们倾向于说“是的,当然......我不需要那些疯狂的数字”。嗯,津巴布韦人也常这么说。不久前。

假设您需要用津巴布韦元记录一笔 100 万美元的交易(今天可能不太可能,但谁知道 10 年后会是什么样子?)。

  1. (100万美元) * (35 Quadrylion ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
  2. 我们需要:
    • 2位数字存储“35”
    • 21 位数字用于存储零
    • 小数点右边 4 位
  3. 这使得十进制(27,4)每个条目花费 15 个字节
  4. 我们可以免费在左边添加一位数字 - 我们有十进制(28,4)15个字节
  5. 现在我们可以存储以津巴布韦元表示的 1000 万美元交易,或者避免再次发生通货膨胀,希望这种情况不会发生

虽然这可能会迟到,但它会对其他人有所帮助。从我的经验和研究中我已经知道并接受十进制(19,6)。那就是使用php和mysql时。在处理大量资金和汇率时

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top