货币列的货币、小数或数字

Posted

技术标签:

【中文标题】货币列的货币、小数或数字【英文标题】:Money, Decimal or Numeric for Currency Columns 【发布时间】:2014-03-25 04:29:11 【问题描述】:

我正在创建一个 SQL 表来保存事务:

create table dbo.TRANSACTIONS
(
  Id int identity not null,
  Amount money not null
);

对于货币(我使用欧元),我应该使用货币、小数还是数字?

我已经看到这三个被应用于货币列,所以我不确定了。

钱是显而易见的选择……但我见过十进制和数字。

顺便说一下,我使用的是 SQL Server 2012。

谢谢

【问题讨论】:

【参考方案1】:

首先,Decimal 和 Numeric 具有相同的功能 (MSDN info about it)

要回答新问题 money VS decimal,已经有一个 *** 问题:Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server? - 简短回答是:

永远不要使用金钱,它不精确而且纯粹是垃圾,始终使用十进制/数字

SQLMenace

【讨论】:

我已经读过......在我阅读他们使用小数 (19,4) 的帖子之前,我正在考虑使用小数 (20, 4)。例如为什么使用小数(19,4)而不是小数(20, 8)?有什么原因吗? 您使用 4 表示刻度,因为大多数货币对于 4 位小数逗号都是精确的。并且您使用 19 作为精度 (p),因为 19 是十进制使用 9 个存储字节的最高精度。当您将 20 用于 p 时,您将使用 13 个字节。您可以在MSDN link in my answer 中阅读它,因此如果您想获得更高的精度,请直接选择 28 有什么理由使用 9 个存储字节?在这种情况下,我将使用它来存储付款并对其进行计算……我认为我不需要这么高的精度。如果我使用一个小的,比如 12,计算会不会更快,或者我需要去 9,所以我得到 5 个存储字节? 在表格中您可以看到,只有当您的精度为 9 或更低时,您才会使用 5 个存储字节,这使您的 s 为 4,最大数量为 99,999。我不会在这里进行微优化,只选择最常见的值。【参考方案2】:

如果您有大数据并且想要有效地记忆数据,请使用整数。当您在前端查看数据时,只需将数字除以 100。

【讨论】:

【参考方案3】:

听起来您使用的是单一货币(欧元),所以我会使用十进制而不是货币。货币的主要优点是它可以以“区域友好”的方式显示。

货币的精度有限,因此更容易出现舍入误差。加减法没问题,但如果你用钱除以钱(百分比或比率),你会失去精确度,尤其是在重复操作时。

【讨论】:

【参考方案4】:

Decimal and Numeric 用于almost all purposes、equivalent

Money不是标准的Sql类型,可能有other reasons也可以避免。

所以选择合适的比例和精度并使用DECIMAL

回复:DECIMAL(19,4) vs (20,4)

precision vs storage table here 总结了一切。

19,4 将存储一个值999 999 999 999 999.9999,成本为 9 个字节。 20 的精度需要13 字节,除非您需要额外的精度(在这种情况下,您可以使用相同的存储空间达到 28 的精度),否则 IMO 将是一种浪费。

此外,对于相同的 9 个字节,您还可以使用例如19,2,将存储 99 999 999 999 999 999.99

【讨论】:

我本来打算用小数(20,4)...你觉得这样合理吗? 我已经更新了。除非你真的需要额外的精度,否则我会选择 19,4。 FWIW 19,4 存储了美国超过 20 万亿美元的赤字。此外,如果您不需要小数点后 4 位,例如,您可以使用 19,2 来允许更大的值。 在这种情况下,我只在网站上存储付款。那么我需要这么高的精度吗?我认为十进制的默认值是 (18, 4)。 18和19在性能上有很大区别吗?我相信在空间方面它是相同的,因为字节是相同的,除非我使用 (9, 4) 这是 5 个存储字节。 您比我们更了解您的要求 :) 但是,是的,您有原则。 9,4 为您提供最大值 99 999.9999。根据 zahorek,除非另有业务要求,否则 9、19、28 或 38 的精度通常是“数量”。

以上是关于货币列的货币、小数或数字的主要内容,如果未能解决你的问题,请参考以下文章

DecimalFormat(数字格式)

ACCESS,货币数据类型等价于具有啥属性的数据数字类型?

货币上的符号是啥?

将具有多个小数位的数字格式化为货币

js千分位分隔,数字货币化方法学习记录

在角度 2 中,如何将数字显示为两位小数的四舍五入货币?