我想在MySQL数据库中存储许多记录。它们都包含金钱价值。但是我不知道每个数字将插入多少个数字。
为此,我必须使用哪种数据类型?
VARCHAR或INT(或其他数字数据类型)?
我想在MySQL数据库中存储许多记录。它们都包含金钱价值。但是我不知道每个数字将插入多少个数字。
为此,我必须使用哪种数据类型?
VARCHAR或INT(或其他数字数据类型)?
Answers:
由于资金需要精确的表示,因此不要使用只近似的数据类型float
。您可以将定点数字数据类型用于
decimal(15,2)
15
是精度(值的总长度,包括小数位)2
是小数点后的位数请参见MySQL数值类型:
当保留精确度很重要时,例如使用货币数据,则可以使用这些类型。
decimal
和numeric
都一样。
numeric(19,4)
财务记录为您提供了更好的玩法,并轻松采用了新要求。
您可以使用DECIMAL
或NUMERIC
两者都相同
DECIMAL和NUMERIC类型存储精确的数值数据值。当保留精确度很重要时,例如使用货币数据,则可以使用这些类型。在MySQL中,NUMERIC被实现为DECIMAL,因此以下有关DECIMAL的说明同样适用于NUMERIC。:MySQL
即 DECIMAL(10,2)
我更喜欢使用BIGINT
,并将值乘以100来存储,以便它将变为整数。
例如,为了表示货币值93.49
,该值应存储为9349
,同时显示该值,我们可以除以100并显示。这将占用更少的存储空间。
注意:
通常,我们不执行currency * currency
乘法运算,以防万一,如果将结果除以100并存储,则它会返回正确的精度。
$0.005
或$0.12345
)存储货币,请小心使用除垢方法,因为它们在乘以100后不会减少为整数。如果您知道值的精度,则很明显最好的选择是使用DECIMAL
。但是,如果您不知道精度(如我的示例),那么……会FLOAT
合适吗?
这取决于您的需要。
DECIMAL(10,2)
通常使用就足够了,但是如果您需要更精确的值可以设置DECIMAL(10,4)
。
如果您使用较大的值,请替换10
为19
。
如果您的应用程序需要处理高达一万亿美元的货币值,那么这应该起作用:13,2如果您需要遵守GAAP(公认会计原则),则使用:13,4
通常,在将输出舍入到13.2之前,您应该将货币值总和为13.4。
实际上,这取决于程序员的偏好。我个人使用:numeric(15,4)
遵守公认会计准则(GAAP)。
double
。*喘气*
因为它可以表示任何15位数字,但对小数点在哪里没有限制。全部只有8个字节!
因此可以表示:
0.123456789012345
123456789012345.0
...以及介于两者之间的任何内容。
这很有用,因为我们正在处理全球货币,并且double
可以存储可能遇到的各种小数位数。
单个double
字段可以表示999,999,999,999,999日元(日元),9,999,999,999,999.99s(美元),甚至9,999,999.99999999s(比特币)。
如果您尝试使用 decimal
,则需要decimal(30, 15)
14个字节。
当然,使用 double
并非没有警告。
但是,并非如某些人所指出的那样准确性下降。即使它double
本身在内部可能不适合Base 10系统,也可以通过以下方式使其精确将从数据库中拉出的值四舍五入到有效的小数位来使其精确。如果需要的话。(例如,如果要输出,并且需要以10为基数的表示形式。)
需要注意的是,每当我们对其执行算术运算时,都需要在以下步骤之前对结果进行规范化(将其舍入为有效的小数位):
另一种警告是,与decimal(m, d)
数据库将阻止程序插入数字以外的m
数字不同,,此类验证不存在double
。一个程序可能会插入一个用户输入的20位数的值,最终将被默默记录为一个不正确的金额。
1.410000000000
(小数点后十二位),但将其乘以1,000,000,000,000(小数点后还有13个有效数字)意味着我们正在使用至少相加的25位有效数字。这远远超过了双倍可用的15,因此从设计角度来看,我认为它会非常残破。
当时有人问这个问题,没人想到比特币价格。对于BTC,可能不足以使用DECIMAL(15,2)
。如果比特币的价格升至100,000美元或更多,我们将至少需要DECIMAL(18,9)
在我们的应用程序中支持加密货币。
DECIMAL(18,9)
在MySQL中占用12个字节的空间(每9个数字4个字节)。
BIGINT
在所有“正常”情况下,将钱乘以100或更多以节省更少的存储空间是没有意义的。
DECIMAL(13,4)
DECIMAL
。
DECIMAL(13,4)
代表9位数字+ 4个小数位数(小数位)=> 4 + 2字节= 6字节BIGINT
。如果需要符合GAAP规范,或者您需要保留小数点后4位:
DECIMAL(13,4)支持最大值:
$ 999,999,999.9999
否则,如果两个小数位足够:DECIMAL(13,2)
src:https://rietta.com/blog/best-data-types-for-currencymoney-in/
乘以10000并存储为BIGINT,如Visual Basic和Office中的“货币”。请参阅https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
deimal(10,2)
我使用的是...您可以根据期望的大小调整值