Money PHP - 将 Money 对象保存在数据库中的无损方法

Posted

技术标签:

【中文标题】Money PHP - 将 Money 对象保存在数据库中的无损方法【英文标题】:Money PHP - Loseless way to Persist Money Object in Database 【发布时间】:2018-02-07 10:16:31 【问题描述】:

我指的是moneyphp/money 库,我计划在我们的一个项目中使用它来处理货币。文档很棒,只是它没有涉及如何在数据库中持久化。它谈到了将货币对象编码为 JSON,但存储字符串使得查询变得像比较金额或货币一样简单。

通过问题,我发现很少有关于教义的讨论,而且它对教义是如此具体,以至于我无法从中受益。

用简洁的话问我的问题:如何在不丢失细节的情况下存储货币对象?我对 Postgresql 很感兴趣,但是任何关系数据库都可以。

注意:我已经阅读了许多不同的方法来将货币保存在数据库中,他们differ in how they do。对与此特定库一起使用的特定方式感兴趣。

【问题讨论】:

有什么反对分别存储这两个字段的吗?这似乎是最自然的方式。 没有。我没有这个限制。只要存储/检索是无损的,就可以了。唯一的限制是(1)运行查询应该很容易(2)保存和检索数据应该是无损的。 为了方便那些不熟悉库的人,您需要存储哪些确切的属性? 如果分割属性没问题,那么我认为无损存储完全取决于数据库系统。但是检查:moneyphp.org/en/latest/concept.html#integer-limit 意味着不鼓励使用字符串类型以外的任何东西。这意味着在数据库中进行计算可能会出现问题。 我建议两个字符串字段(具有适当的长度),而不是在数据库内进行计算。 【参考方案1】:

在阅读了许多不同的线程、帖子等之后,我得出的结论是只有两种方式是可以接受的(请参阅 this question 中的优秀 cmets):

    每次保存到数据库时将所有货币转换为最小单位(例如美分),并在检索时重新转换。

    使用所需精度的 DECIMAL/NUMERIC 数据类型(在进行正常操作时,许多人建议使用 NUMERIC(15,4),如果进行货币兑换操作,则建议使用 NUMERIC(15,6))

当然无论选择什么,都必须加上货币栏目。

因为this library(当我问这个问题时,这不是原来的),我最终选择了第一种方法,这使得这非常容易。以下是我创建issue后作者的解释:

我只能告诉你,我个人将我的资金存储在数据库中 作为一个整数,表示以次要单位(美分)为单位的金额,以及 如果应用程序使用多个货币,则可选 CHAR(3) 货币(否则货币在应用程序中是硬编码的)。

您可以通过这种方式以整数形式获得次要单位的金额:

$money->getMinorAmount()->toInt();

您可以从存储在数据库中的整数中检索 Money 使用:

Money::ofMinor($integerAmount, 'USD');

【讨论】:

注意,您的示例代码适用于brick/money,而不是moneyphp/money ;) 我放弃了图书馆有两个原因(1)与对另一个(链接)的友好回应相比,对我打开的问题的严厉回应大致相同。 (2)砖库支持最小转换单位的自动转换,从而简化了事情。我会加粗那部分!

以上是关于Money PHP - 将 Money 对象保存在数据库中的无损方法的主要内容,如果未能解决你的问题,请参考以下文章

请问在c# winform中怎么将文本框中的数值保存到数据库中money类型的字段中???

PHP 算法习题

Discord money bot 将用户 ID 保存在 json 文件中。当 Not 重新启动时,它会为每个人创建一个新的(但相同的)ID

用 PHP 格式化数字

php常用函数

php格式化金额函数分享