PostgreSQL:哪种数据types应该用于货币?
看起来像Money
types是不鼓励的,如这里所述
我的应用程序需要存储货币,我应该使用哪种数据types? 数字,金钱还是FLOAT?
数字强制2单位精度。 不要使用float或floattypes的数据types来表示货币,因为如果你这样做的话,当财务报告的底线数字被+或 – 几美元不正确的时候,人们将会不高兴。
据我所知,金钱types只是由于历史原因而留下的。
你的来源绝不是官方的。 它可以追溯到2011年,我甚至不认识这些作者。 如果钱的types是“不鼓励”的PostgreSQL会在手册中这么说 – 事实并非如此 。
对于更多的官方消息来源 ,请阅读pgsql-general(从本周开始!)的核心代码,核心开发人员包括D'Arcy JM Cain(原始作者)和Tom Lane:
基本上, money
有其(有限的)用途。 与numeric
相比的优点是性能 。
decimal
只是Postgres中的numeric
的别名。
有关最近发布的改进的相关答案(和评论!):
- 贾斯珀报告:无法获得类'org.postgresql.util.PGmoney'字段'x'的值
我个人喜欢将货币存储为代表Cents的integer
。 这比其他任何提到的选项更有效率。
您的select是:
-
integer
:存储以美分为单位的金额。 这是EFTPOS交易使用的。 -
decimal(12,2)
:存储精确到两位小数的金额。 这是大多数总账软件使用的。 -
float
:可怕的想法 – 准确度不够。 这是天真的开发人员使用的。
选项2是最常用和最容易处理的。 把精度(在我的例子中是12,意思是总共12位数)尽可能大或小,这对于你来说是最合适的。
请注意,如果您将计算结果(如涉及汇率)的多个交易汇总为具有商业含义的单个值,则精度应该更高以提供准确的macros观值; 考虑使用像decimal(18, 8)
这样的总和是准确的,并且各个值可以四舍五入到分精度显示。
我把所有的货币领域都保留下来:
numeric(15,6)
有这么多的小数位似乎过分,但如果有一点机会,你将不得不处理多种货币,你将需要转换的精度。 无论我提出的用户,我总是存储到美元。 以这种方式,我可以随时转换成任何其他货币,因为当天的兑换率。
如果除了一种货币之外你什么都不做,那么最糟糕的是你浪费了一点空间来存储一些零。