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


当前回答

在提出这个问题的时候,没有人考虑比特币的价格。在BTC的情况下,使用DECIMAL(15,2)可能是不够的。如果比特币将上涨到10万美元或更多,我们将至少需要DECIMAL(18,9)来支持我们的应用程序中的加密货币。

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

其他回答

因为货币需要精确的表示,所以不要使用像float这样的近似数据类型。您可以使用定点数值数据类型

decimal(15,2)

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

参见MySQL数值类型:

当需要保持精确的精确度时,例如货币数据,就会使用这些类型。

你可以使用DECIMAL或NUMERIC,两者都是一样的

DECIMAL和NUMERIC类型存储精确的数值数据值。当需要保持精确的精确度时,例如货币数据,就会使用这些类型。在MySQL中,NUMERIC被实现为DECIMAL,因此下面关于DECIMAL的说明同样适用于NUMERIC。: MySQL

例如十进制(10,2)

良好的阅读

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

我更喜欢使用BIGINT,并通过与100相乘来存储值,这样它将成为整数。

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

警告: 大多数情况下,我们不执行货币*货币乘法,以防万一,如果我们正在执行,然后将结果除以100并存储,以便返回适当的精度。

我们用double。

*喘息*

Why?

因为它可以表示任何15位的数字而不受小数点位置的限制。所有这些都只有可怜的8个字节!

所以它可以表示:

0.123456789012345 123456789012345.0

...以及介于两者之间的任何东西。

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

一个双字段可以代表日元的999,999,999,999,999,美元的99999,999,999.99,甚至比特币的99999,999.99999999

如果您尝试对decimal进行同样的操作,则需要decimal(30,15),它占用14个字节。

警告

当然,使用double也不是没有注意事项。

然而,这并不像一些人倾向于指出的那样失去准确性。尽管double本身在内部可能不精确到以10为基数的系统,但我们可以通过将从数据库中提取的值四舍五入到有效的小数点后数位来使其精确。如果需要的话。(例如,如果它将被输出,并且需要以10为基数的表示。)

需要注意的是,任何时候我们使用它进行算术运算时,我们都需要在以下情况下对结果进行归一化(通过四舍五入到有效的小数点位):

对其执行比较。 将其写入数据库。

另一种警告是,与decimal(m, d)不同的是,数据库将阻止程序插入多于m位的数字,而double则不存在这样的验证。一个程序可以插入一个用户输入的20位数字,它最终会被无声地记录为一个不准确的数量。