在MySQL中存储货币值的最佳数据类型

时间:2012-10-23 12:25:30

标签: mysql sqldatatypes currency

我想在MySQL数据库中存储许多记录。所有这些都包含货币价值。但我不知道每个数字会插入多少位数 我必须使用哪种数据类型?
VARCHAR INT (或其他数字数据类型)?

12 个答案:

答案 0 :(得分:331)

由于资金需要精确表示,因此不要使用仅与float类似的数据类型。您可以使用定点数字数据类型,如

decimal(15,2)
  • 15是精度(包括小数位的值的总长度)
  • 2是小数点后的位数

请参阅MySQL Numeric Types

  

在保持精确精确度非常重要时使用这些类型,例如使用货币数据。

答案 1 :(得分:83)

您可以使用DECIMALNUMERIC两者相同

  

DECIMAL和NUMERIC类型存储精确的数值数据值。在保持精确精度很重要时使用这些类型,例如使用货币数据。在MySQL中,NUMERIC实现为DECIMAL,因此以下关于DECIMAL的评论同样适用于NUMERIC。 :MySQL

DECIMAL(10,2)

  

Example settings

Good read

答案 2 :(得分:28)

我更喜欢使用BIGINT,并将值存储在乘以100 ,以便它将变为整数。

例如,要表示93.49的货币值,该值应存储为9349,同时显示我们可以除以100 的值并显示。这将占用更少的存储空间。

  

<强>注意:
  大多数情况下,我们不执行currency * currency乘法,如果我们这样做,则将结果除以100并存储,以便它返回到适当的精度。

答案 3 :(得分:26)

这取决于你的需要。

使用DECIMAL(10,2)通常已足够,但如果您需要更精确的值,可以设置DECIMAL(10,4)

如果使用大值,请将10替换为19

答案 4 :(得分:14)

如果您的应用程序需要处理高达万亿的货币价值,那么这应该有效:13,2 如果您需要遵守GAAP(一般公认会计原则),请使用:13,4

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

答案 5 :(得分:6)

事实上,这取决于程序员的偏好。我个人使用:numeric(15,4)符合公认会计原则( GAAP

答案 6 :(得分:3)

尝试使用

Decimal(19,4)

这通常适用于所有其他数据库

答案 7 :(得分:3)

在提出这个问题时,没人想到比特币的价格。在BTC的情况下,使用DECIMAL(15,2)可能不够。如果比特币价格上涨到100,000美元或更高,我们至少需要DECIMAL(18,9)来支持我们应用中的加密货币。

DECIMAL(18,9)在MySQL中占用12个字节的空间(4 bytes per 9 digits)。

答案 8 :(得分:3)

我们使用double

*喘气*

为什么?

因为它可以代表任何15位数字,而对小数点的位置没有限制。全部只有8个字节!

所以它可以代表:

  • 0.123456789012345
  • 123456789012345.0

......以及介于两者之间的任何事情。

这很有用,因为我们正在处理全球货币,而double可以存储我们可能会遇到的各种小数位数。

单个double字段可以表示日元为999,999,999,999,999,美元为9,999,999,999,999.99,比特币为9,999,999.99999999

如果您尝试对decimal执行相同操作,则需要decimal(30, 15),费用为14个字节。

注意事项

当然,使用double并非没有警告。

然而,正如一些人倾向于指出的那样,并不是精度的损失。尽管double本身可能不是内部精确到基础10系统,但我们可以通过舍入我们从数据库中提取的值来确定它小数位。如果需要的话。 (例如,如果要输出,则需要基数10表示。)

注意事项是,无论何时我们使用它进行算术运算,我们都需要将结果标准化(通过将其四舍五入到有效小数位):

  1. 对其进行比较。
  2. 将其写回数据库。
  3. 另一种警告是,与数据库阻止程序插入超过decimal(m, d)数字的数字的m不同,double不存在此类验证。一个程序可以插入一个用户输入的20位数值,它最终会被静默记录为不准确的数量。

答案 9 :(得分:0)

乘以10000并存储为BIGINT,例如&#34;货币&#34;在Visual Basic和Office中。见https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

答案 10 :(得分:0)

将钱存储为BIGINT乘以100或更多,以使用更少的存储空间的原因在所有“正常”情况下都是没有意义的。

答案 11 :(得分:0)

如果需要符合GAAP标准,或者您需要保留4位小数位:

DECIMAL(13,4) 支持的最大值为:

$ 999,999,999.9999

否则,如果2个小数位足够: DECIMAL(13,2)

src:https://rietta.com/blog/best-data-types-for-currencymoney-in/