我想在MySQL数据库中存储许多记录 . 所有这些都包含货币 Value . 但我不知道每个数字会插入多少位数 .我必须为此目的使用哪种数据类型?VARCHAR或INT(或其他数字数据类型)?
由于资金需要精确的表示,因此不要使用像 float 这样的近似数据类型 . 您可以使用定点数字数据类型
float
decimal(15,2)
15 是精度(包括小数位的值的总长度)
15
2 是小数点后的位数
2
见MySQL Numeric Types:
在保持精确精度很重要时使用这些类型,例如使用货币数据 .
您可以使用 DECIMAL 或 NUMERIC 两者相同
DECIMAL
NUMERIC
DECIMAL和NUMERIC类型存储精确的数值数据值 . 在保持精确精度很重要时使用这些类型,例如使用货币数据 . 在MySQL中,NUMERIC实现为DECIMAL,因此以下有关DECIMAL的备注同样适用于NUMERIC . :MySQL
即 DECIMAL(10,2)
DECIMAL(10,2)
Good read
我更喜欢使用 BIGINT ,并将值存储乘以100,这样它就会变成整数 .
BIGINT
例如,要表示货币值 93.49 ,该值应存储为 9349 ,同时显示我们可以除以100的值并显示 . 这将占用更少的存储空间 .
93.49
9349
注意:大多数情况下,我们不执行货币*货币乘法,如果我们这样做,则将结果除以100并存储,以便它返回到适当的精度 .
这取决于你的需要 .
通常使用 DECIMAL(10,2) 已足够,但如果您需要更精确的值,可以设置 DECIMAL(10,4) .
DECIMAL(10,4)
如果使用大值,请将 10 替换为 19 .
10
19
如果您的申请需要处理高达万亿的货币 Value ,那么这应该有效:13,2如果您需要遵守GAAP(公认会计原则),那么使用:13,4
通常,在将输出舍入到13,2之前,您应该将您的货币值加总为13,4 .
实际上,这取决于程序员的偏好 . 我个人使用: numeric(15,4) 符合公认会计原则( GAAP ) .
numeric(15,4)
尝试使用
Decimal(19,4)
这通常适用于所有其他数据库
当时这个问题被问到没人想到比特币的价格 . 在BTC的情况下,使用 DECIMAL(15,2) 可能是不够的 . 如果比特币涨到100,000美元或更多,我们至少需要 DECIMAL(18,9) 来支持我们的应用中的加密货币 .
DECIMAL(15,2)
DECIMAL(18,9)
DECIMAL(18,9) 在MySQL(4 bytes per 9 digits)中占用12个字节的空间 .
喘气
因为它可以表示任何15位数字,而小数点的位置没有限制 . 全部只有8个字节!
所以它可以代表:
0.123456789012345
123456789012345.0
......以及其中的任何事物 .
这很有用,因为我们正在处理全球货币, double 可以存储我们可能遇到的各种小数位数 .
double
单个 double 字段可以表示日元为999,999,999,999,999,美元为9,999,999,999,999.99,比特币为9,999,999.99999999
如果您尝试使用 decimal 执行相同操作,则需要 decimal(30, 15) ,其成本为14个字节 .
decimal
decimal(30, 15)
当然,使用 double 并非没有警告 .
然而,有些人倾向于指出 it's not 精度的损失 . 尽管 double 本身可能与基本10系统内部不完全相同,但我们可以通过 rounding the value 将数据库从数据库拉到其有效小数位 . 如果需要的话 . (例如,如果要输出,则需要基数10表示 . )
需要注意的是,无论何时我们使用它进行算术运算,我们都需要将结果标准化(通过将其四舍五入到有效小数位):
对其进行比较 .
将其写回数据库 .
另一种警告是,与 decimal(m, d) 不同,数据库将阻止程序插入超过 m 数字的数字, double 不存在此类验证 . 程序可以插入用户输入的20位数值,并且最终会被静默记录为不准确的数量 .
decimal(m, d)
m
将数字乘以10000并存储为BIGINT,如Visual Basic和Office中的"Currency" . 见https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
10 回答
由于资金需要精确的表示,因此不要使用像
float
这样的近似数据类型 . 您可以使用定点数字数据类型15
是精度(包括小数位的值的总长度)2
是小数点后的位数见MySQL Numeric Types:
您可以使用
DECIMAL
或NUMERIC
两者相同即
DECIMAL(10,2)
Good read
我更喜欢使用
BIGINT
,并将值存储乘以100,这样它就会变成整数 .例如,要表示货币值
93.49
,该值应存储为9349
,同时显示我们可以除以100的值并显示 . 这将占用更少的存储空间 .这取决于你的需要 .
通常使用
DECIMAL(10,2)
已足够,但如果您需要更精确的值,可以设置DECIMAL(10,4)
.如果使用大值,请将
10
替换为19
.如果您的申请需要处理高达万亿的货币 Value ,那么这应该有效:13,2如果您需要遵守GAAP(公认会计原则),那么使用:13,4
通常,在将输出舍入到13,2之前,您应该将您的货币值加总为13,4 .
实际上,这取决于程序员的偏好 . 我个人使用:
numeric(15,4)
符合公认会计原则( GAAP ) .尝试使用
这通常适用于所有其他数据库
当时这个问题被问到没人想到比特币的价格 . 在BTC的情况下,使用
DECIMAL(15,2)
可能是不够的 . 如果比特币涨到100,000美元或更多,我们至少需要DECIMAL(18,9)
来支持我们的应用中的加密货币 .DECIMAL(18,9)
在MySQL(4 bytes per 9 digits)中占用12个字节的空间 .我们使用双倍 .
喘气
为什么?
因为它可以表示任何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
并非没有警告 .然而,有些人倾向于指出 it's not 精度的损失 . 尽管
double
本身可能与基本10系统内部不完全相同,但我们可以通过 rounding the value 将数据库从数据库拉到其有效小数位 . 如果需要的话 . (例如,如果要输出,则需要基数10表示 . )需要注意的是,无论何时我们使用它进行算术运算,我们都需要将结果标准化(通过将其四舍五入到有效小数位):
对其进行比较 .
将其写回数据库 .
另一种警告是,与
decimal(m, d)
不同,数据库将阻止程序插入超过m
数字的数字,double
不存在此类验证 . 程序可以插入用户输入的20位数值,并且最终会被静默记录为不准确的数量 .将数字乘以10000并存储为BIGINT,如Visual Basic和Office中的"Currency" . 见https://msdn.microsoft.com/en-us/library/office/gg264338.aspx