【问题标题】:INT vs DECIMAL for "Price" column in mysql?mysql中“价格”列的INT vs DECIMAL?
【发布时间】:2014-12-05 17:59:46
【问题描述】:

我看到了一些类似问题的答案herehere。似乎每个人都建议使用 DECIMAL 类型的价格。但是,由于价格通常不会低于 1 美分,我可以通过将单位从“美元”更改为“美分”来使用 INT 类型的价格吗?例如,7.99 美元等于 799 美分。

在存储空间、读/写速度、使用函数(MIN、MAX、SUM 等)时的性能或其他方面,选择 INT 是否比 DECIMAL(9,2) 有任何优势?

【问题讨论】:

  • 计算可能更快,但值不太直观。我建议使用更直观的版本,将小数点放在正确的位置——将值存储为美分似乎是一个等待发生的错误。
  • 我听说(/看到?)它认为存储整数有性能优势。就个人而言,我不相信。我怀疑数据集必须非常庞大才能有所作为。
  • @GordonLinoff:什么样的错误?这是一种常用的方法。
  • @KarolyHorvath 也许是一个错误,涉及某人将产品添加到数据库并以 5 美分而不是 5 美元的价格出售...
  • @jimmy:啊,你的意思是愚蠢?我怀疑是否有一种方法可以防止这些问题......

标签: mysql


【解决方案1】:

我建议以最小的适用单位将货币值表示为普通的旧整数。通常对于美元之类的东西,这意味着使用美分,但有时您可能需要使用较小的单位。这方面的一个例子是为每笔只有几美分的交易支付 5% 的佣金,否则四舍五入会使它们变成零。在这种情况下,使用“millicents”可能会更好。

虽然固定位置的 DECIMAL(9,2) 列会忠实地保留值,但您使用的应用程序平台可能不会很好地处理它们,如果您不小心,可能会导致奇怪的浮点行为发生。

必须在美元和内部单位之间进行转换来表示它们可能有点烦人,但这远不如必须向会计部门解释所有这些钱丢失的地方那么烦人。

在性能方面,INT 值默认是最快的。一般来说,它们也是最紧凑的。如果您需要存储超过 +/-2.1B 的值(如果您正在处理大量美元,这很可能),您将需要使用 BIGINT。这可能会出现问题,如果您的应用程序脚本语言没有准备好,可能会将它们呈现为浮点数并导致问题。

与往常一样,用大小值彻底测试您的代码。

【讨论】:

    【解决方案2】:

    我建议使用美分,因为浮点数对于计算机来说很难管理。例如,如果我可以在 js 中回忆 0,1+0,2 将不会返回 0,3。

    因此,尤其是在处理金钱时,我会说使用美分是最佳做法。

    编辑:也许我还不够清楚。看看 tadman 留下的长评论,它更详细地解释了我的想法。

    问题是选择 int 是否有任何优势。我的回答是肯定的,这是肯定的,因为当你将处理脚本中的信息时(会发生什么,因为 db 通常不单独使用),最好使用 int 来操纵金钱。是不是有点出乎意料?也许,这取决于你的胸怀有多宽广。它值得 -1 吗?我不这么认为。

    【讨论】:

    • 浮点数不是小数。
    • 谁提到了花车?问题是整数与小数。
    • 数据库的用途是什么?与脚本一起使用 no ?
    猜你喜欢
    • 2023-03-06
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多