在mysql中存储金钱值的最佳数据类型

dl5txlt9  于 2021-06-15  发布在  Mysql
关注(0)|答案(12)|浏览(1012)

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

wgmfuz8q

wgmfuz8q1#

乘以10000并存储为bigint,如visualbasic和office中的“currency”。看到了吗https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

ih99xse1

ih99xse12#

如果您的应用程序需要处理高达1万亿的货币价值,那么这应该是可行的:13,2如果您需要遵守gaap(公认会计原则),那么使用:13,4
通常情况下,在将输出四舍五入到13,2之前,你应该将你的货币价值加在13,4。

vulvrdjw

vulvrdjw3#

在提出这个问题的时候,没有人考虑比特币的价格。在btc的情况下,它可能不足以使用 DECIMAL(15,2) . 如果比特币能涨到10万美元以上,我们至少需要 DECIMAL(18,9) 在我们的应用程序中支持加密货币。 DECIMAL(18,9) 在mysql中占用12字节的空间(每9位4字节)。

sg3maiej

sg3maiej4#

尝试使用

Decimal(19,4)

这通常也适用于其他db

gcmastyq

gcmastyq5#

我更喜欢用 BIGINT ,并将值乘以100存储在中,使其成为整数。
例如,表示 93.49 ,值应存储为 9349 ,在显示值时,我们可以除以100并显示。这将占用更少的存储空间。
注意事项:
大多数情况下我们不表演 currency * currency 乘法,如果我们正在做,那么将结果除以100并存储,这样它就返回到适当的精度。

avkwfej4

avkwfej46#

这取决于你的需要。
使用 DECIMAL(10,2) 通常是足够的,但如果你需要一点更精确的值,你可以设置 DECIMAL(10,4) .
如果你的工作有很大的价值观 1019 .

lb3vh1jj

lb3vh1jj7#

如果要求符合公认会计原则,或您需要4位小数:
支持以下最大值的十进制(13,4):
$999,999,999.9999
否则,如果两位小数足够:十进制(13,2)
src公司:https://rietta.com/blog/best-data-types-for-currencymoney-in/

z18hc3ub

z18hc3ub8#

把钱存起来 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字节
与存储所需的8个字节相比 BIGINT .

nr7wwzry

nr7wwzry9#

因为金钱需要一个精确的表示,所以不要使用近似的数据类型 float . 您可以使用定点数字数据类型,例如

decimal(15,2)
``` `15` 是精度(值的总长度,包括小数位) `2` 小数点后的位数
请参见mysql数字类型:
当需要保持精确精度时(例如货币数据),可以使用这些类型。
eit6fx6z

eit6fx6z10#

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

sc4hvdpw

sc4hvdpw11#

我们用双人床。

  • 喘息*

为什么?

因为它可以表示任意15位数字,而不受小数点位置的限制。都是为了区区8个字节!
所以它可以表示:
0.123456789012345 123456789012345.0 …以及介于两者之间的任何东西。
这是有用的,因为我们正在处理全球货币问题,而且 double 可以存储我们可能遇到的各种小数位数。
单身汉 double 字段可以用日语表示9999999999999999,用美元表示99999999999999999.99,甚至用比特币表示999999999.9999999999
如果你试着用同样的方法 decimal ,你需要 decimal(30, 15) 它需要14个字节。

注意事项

当然,使用 double 不是没有警告。
然而,这并不是像一些人指出的那样失去准确性。尽管 double 它本身在内部可能并不精确到以10为基数的系统,我们可以通过将从数据库中提取的值四舍五入到其有效的小数位来使其精确。如果需要的话(e、 g.如果要输出,则需要10进制表示。)
需要注意的是,任何时候我们用它进行算术运算时,我们都需要在以下时间之前对结果进行规范化(通过将结果四舍五入到有效的小数位):
对它进行比较。
写回数据库。
另一种警告是 decimal(m, d) 数据库将阻止程序插入超过 m 数字,则不存在此类验证 double . 一个程序可以插入一个用户输入的20位数字的值,它最终会被无声地记录为一个不准确的量。

ux6nzvsh

ux6nzvsh12#

你可以用 DECIMAL 或者 NUMERIC 两者都是一样的
decimal和numeric类型存储精确的数字数据值。当需要保持精确精度时(例如货币数据),可以使用这些类型。在mysql中,numeric实现为decimal,因此以下关于decimal的注解同样适用于numeric:mysql数据库
DECIMAL(10,2)
博览群书

相关问题