货币列的货币、小数或数字
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 的精度通常是“数量”。以上是关于货币列的货币、小数或数字的主要内容,如果未能解决你的问题,请参考以下文章