PostgreSQL:哪种数据类型应该用于货币?

时间:2013-03-31 05:06:15

标签: sql postgresql database-design

here

所述,不建议使用Money类型

我的应用需要存储货币,我应该使用哪种数据类型?数字,金钱还是FLOAT?

6 个答案:

答案 0 :(得分:90)

您的来源绝不是正式的。它可以追溯到2011年,我甚至不承认作者。如果货币类型“气馁”,PostgreSQL会在手册中说明这一点 - which it doesn't

对于更官方消息来源,请阅读this thread in pgsql-general (from just this week!),其中包括来自核心开发人员的声明,包括D'Arcy J.M. Cain(钱币类型的原始作者)和Tom Lane:

基本上,money有其(有限)用途。优于numeric的优势是性能

decimal只是Postgres中numeric的别名。

有关最新版本改进的相关答案(和评论!):

就个人而言,我喜欢将货币存储为代表Cents的integer。这比任何其他提到的选项更有效。

答案 1 :(得分:78)

Numeric强制2单位精度。永远不要使用float或float这样的数据类型来表示货币,因为如果你这样做,当财务报告的底线数字不正确+或 - 几美元时,人们就会不高兴。

据我所知,货币类型只是因为历史原因而留下。

答案 2 :(得分:54)

您的选择是:

  1. integer:以美分存储金额。这就是EFTPOS交易所使用的。
  2. decimal(12,2):存储金额正好两位小数。这是大多数总帐软件使用的。
  3. float:糟糕的主意 - 准确性不足。这是天真的开发人员使用的。
  4. 选项2是最常见且最容易使用的选项。使精度(在我的例子中为12,总共12位数)大小,最适合你。

    请注意,如果您将作为计算结果的多个交易(例如涉及汇率)汇总为具有商业含义的单个值,则精度应该更高,以提供准确的宏值;考虑使用类似decimal(18, 8)之类的东西,这样总和是准确的,并且各个值可以四舍五入到精确度以便显示。

答案 3 :(得分:19)

我将所有货币字段保存为:

numeric(15,6)

拥有那么多小数位似乎太过分了,但如果你有多少机会处理多种货币,那么转换你需要那么多精确度。无论我呈现一个用户,我总是存储到美元。这样,考虑到当天的转换率,我可以随时转换为任何其他货币。

如果你从不做任何事情,除了一种货币,最糟糕的是你浪费了一些空间来存储一些零。

答案 4 :(得分:9)

使用BigInt将货币存储为以最小货币单位表示货币值的正整数(例如,存储100美分存储1.00美元或100存储100日元(日元,一种十进制货币)。这就是Stripe的工作-一家最重要的全球电子商务金融服务公司。

答案 5 :(得分:4)

使用64位整数

根据在许多应用程序中的丰富经验,我建议在bigint数据类型中以微美元(或类似的主要货币)存储值。

微型= 1百万分之一,所以1个微型美元= 0.000001美元。这样的精度足以处理不超过一美分的零钱,并且非常适合很小的单价(如广告展示次数或API费用)。

整数也很简单,很小,并且可以兼容所有内容。它们使通过计算轻松保持准确性并在最终输出中应用四舍五入。