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


当前回答

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

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

例如十进制(10,2)

良好的阅读

其他回答

我们用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位数字,它最终会被无声地记录为一个不准确的数量。

有2个有效选项:

使用整数数量的货币小单位(例如分) 将金额表示为货币的十进制值

在这两种情况下,您都应该使用十进制数据类型来拥有足够的有效数字。区别在于精度:

即使是整数数量的小单位,也最好有额外的累加精度(考虑从1美分操作累积10%的费用) 不同的货币有不同数量的小数,加密货币有多达18个小数 由于通货膨胀,小数的数量可以随着时间的推移而改变

来源和更多的警告和事实。

试着用

Decimal(19,4)

这通常适用于所有其他DB以及

如果要求符合GAAP,或者需要小数点后4位:

小数(13、4) 支持最大值为:

The $999999999999

否则,如果小数点后2位足够: 小数(13日2)

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

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

为了与GAAP保持一致,以DECIMAL(13,4)存储货币就足够了。 MySQL手册读到每9位需要4个字节来存储DECIMAL。 https://dev.mysql.com/doc/refman/8.0/en/precision-math-decimal-characteristics.html DECIMAL(13,4)表示9位+ 4位小数(小数点后数位)=> 4 + 2字节= 6字节 与存储BIGINT所需的8个字节相比。