我想在MySQL数据库中存储许多记录。所有这些都包含货币价值。但我不知道每个数字会插入多少位数
我必须使用哪种数据类型?
VARCHAR 或 INT (或其他数字数据类型)?
答案 0 :(得分:331)
由于资金需要精确表示,因此不要使用仅与float
类似的数据类型。您可以使用定点数字数据类型,如
decimal(15,2)
15
是精度(包括小数位的值的总长度)2
是小数点后的位数在保持精确精确度非常重要时使用这些类型,例如使用货币数据。
答案 1 :(得分:83)
您可以使用DECIMAL
或NUMERIC
两者相同
DECIMAL和NUMERIC类型存储精确的数值数据值。在保持精确精度很重要时使用这些类型,例如使用货币数据。在MySQL中,NUMERIC实现为DECIMAL,因此以下关于DECIMAL的评论同样适用于NUMERIC。 :MySQL
即 DECIMAL(10,2)
答案 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表示。)
注意事项是,无论何时我们使用它进行算术运算,我们都需要将结果标准化(通过将其四舍五入到有效小数位):
另一种警告是,与数据库阻止程序插入超过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或更多,以使用更少的存储空间的原因在所有“正常”情况下都是没有意义的。
DECIMAL(13,4)
DECIMAL
。
DECIMAL(13,4)
代表9位数字+ 4个小数位(小数位)=> 4 + 2字节= 6字节BIGINT
所需的8个字节。答案 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/