关于sqldatatypes:在MySQL中存储货币值的最佳数据类型

Best data type to store money values in MySQL

我想在MySQL数据库中存储许多记录。所有这些都包含金钱价值。但我不知道每个数字要插入多少个数字。为此,我必须使用哪种数据类型?varchar或int(或其他数字数据类型)?


因为钱需要精确的表示,所以不要使用与float类似的数据类型。您可以使用定点数字数据类型

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

参见MySQL数字类型:

These types are used when it is important to preserve exact precision, for example with monetary data.


您可以使用DECIMALNUMERIC两者都是相同的

The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve exact precision, for example with monetary data. In MySQL, NUMERIC is implemented as DECIMAL, so the following remarks about DECIMAL apply equally to NUMERIC. : MySQL

DECIMAL(10,2)

Example settings

好读


我更喜欢使用BIGINT,并将值存储在乘以100的形式中,这样它将成为整数。

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

Caution:
Mostly we don't perform currency * currency multiplication, in case if we are doing it then divide the result with 100 and store, so that it returns to proper precision.


这取决于你的需要。

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

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


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

通常,在将输出四舍五入到13,2之前,您应该将您的货币值总和为13,4。


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


我们使用double

*喘息*

为什么?

因为它可以表示任何15位数字,而不限制小数点的位置。只需8个字节!

所以它可以代表:

  • 0.123456789012345
  • 123456789012345.0

…以及两者之间的任何东西。

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

单个double字段可以表示9999999999999 s(日文),99999999999.999 s(美元),甚至9999999.999999999 s(比特币)。

如果您尝试使用DECIMAL,则需要decimal(30, 15),它需要14个字节。

告诫

当然,使用double并不是没有警告的。

然而,正如一些人指出的那样,它并没有失去准确性。即使double本身在内部可能不精确到以10为基数的系统,我们也可以通过将从数据库中提取的值四舍五入到它的有效小数位来精确地计算它。如果需要的话。(例如,如果要输出,则需要以10为基数表示。)

注意事项是,无论何时我们使用它执行算术运算,我们都需要在以下时间之前将结果规范化(通过将其四舍五入到有效的小数位数):

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


    在被问到这个问题的时候,没人考虑比特币的价格。对于BTC,使用DECIMAL(15,2)可能不够。如果比特币升至10万美元或以上,我们至少需要DECIMAL(18,9)来支持我们应用程序中的加密货币。

    DECIMAL(18,9)在mysql中占用12字节的空间(每9位4字节)。


    试用使用

    1
    Decimal(19,4)

    这通常也适用于其他数据库


    乘以10000,存储为bigint,就像VisualBasic和Office中的"货币"。请参阅https://msdn.microsoft.com/en-us/library/office/gg264338.aspx