首页 文章

在MySQL中存储货币值的最佳数据类型

提问于
浏览
232

我想在MySQL数据库中存储许多记录 . 所有这些都包含货币 Value . 但我不知道每个数字会插入多少位数 .
我必须为此目的使用哪种数据类型?
VARCHAR或INT(或其他数字数据类型)?

10 回答

  • 1

    由于资金需要精确的表示,因此不要使用像 float 这样的近似数据类型 . 您可以使用定点数字数据类型

    decimal(15,2)
    
    • 15 是精度(包括小数位的值的总长度)

    • 2 是小数点后的位数

    MySQL Numeric Types

    在保持精确精度很重要时使用这些类型,例如使用货币数据 .

  • 2

    您可以使用 DECIMALNUMERIC 两者相同

    DECIMAL和NUMERIC类型存储精确的数值数据值 . 在保持精确精度很重要时使用这些类型,例如使用货币数据 . 在MySQL中,NUMERIC实现为DECIMAL,因此以下有关DECIMAL的备注同样适用于NUMERIC . :MySQL

    DECIMAL(10,2)

    Good read

  • 81

    我更喜欢使用 BIGINT ,并将值存储乘以100,这样它就会变成整数 .

    例如,要表示货币值 93.49 ,该值应存储为 9349 ,同时显示我们可以除以100的值并显示 . 这将占用更少的存储空间 .

    注意:大多数情况下,我们不执行货币*货币乘法,如果我们这样做,则将结果除以100并存储,以便它返回到适当的精度 .

  • 13

    这取决于你的需要 .

    通常使用 DECIMAL(10,2) 已足够,但如果您需要更精确的值,可以设置 DECIMAL(10,4) .

    如果使用大值,请将 10 替换为 19 .

  • 0

    如果您的申请需要处理高达万亿的货币 Value ,那么这应该有效:13,2如果您需要遵守GAAP(公认会计原则),那么使用:13,4

    通常,在将输出舍入到13,2之前,您应该将您的货币值加总为13,4 .

  • 26

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

  • 3

    尝试使用

    Decimal(19,4)
    

    这通常适用于所有其他数据库

  • 2

    当时这个问题被问到没人想到比特币的价格 . 在BTC的情况下,使用 DECIMAL(15,2) 可能是不够的 . 如果比特币涨到100,000美元或更多,我们至少需要 DECIMAL(18,9) 来支持我们的应用中的加密货币 .

    DECIMAL(18,9) 在MySQL(4 bytes per 9 digits)中占用12个字节的空间 .

  • 307

    我们使用双倍 .

    喘气

    为什么?

    因为它可以表示任何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位数值,并且最终会被静默记录为不准确的数量 .

  • 26

    将数字乘以10000并存储为BIGINT,如Visual Basic和Office中的"Currency" . 见https://msdn.microsoft.com/en-us/library/office/gg264338.aspx

相关问题