哪种SQL Server字段类型最适合存储价格值?

Ber*_*nDK 29 c# sql-server database-design query-optimization linq-to-sql

我想知道SQL Server中的价格字段对于类似商店的结构的最佳类型是什么?

看看这个概述,我们有数据类型称为money,smallmoney,然后我们有十进制/数字,最后浮动真实.

名称,内存/磁盘使用情况和值范围:

  • 资金: 8字节(值:-922,337,203,685,477.5808至+922,337,203,685,477.5807)
  • Smallmoney: 4个字节(值:-214,748.3648到+214,748.3647)
  • 十进制: 9 [默认,分钟.5]字节(值:-10 ^ 38 +1到10 ^ 38 -1)
  • 浮点数: 8个字节(值:-1.79E + 308到1.79E + 308)
  • 实际: 4个字节(值:-3.40E + 38到3.40E + 38)

将价格值存储在这些类型中真的很明智吗?那怎么样.INT?

  • Int: 4个字节(值:-2,147,483,648到2,147,483,647)

让我们说一家商店使用美元,他们有美分,但我认为价格不是49.2142342所以使用大量小数显示美分似乎浪费了SQL带宽.其次,大多数商店不会显示200.000.000附近的任何价格(至少在正常的网上商店,除非有人试图在巴黎卖给我一座着名的塔)

那么为什么不去找一个int?

一个int很快,它只有4个字节,你可以很容易地产生小数,通过以美分而不是美元保存值然后在你呈现值时除以.

另一种方法是使用4个字节的smallmoney,但这需要CPU的数学部分来进行计算,其中Int是整数幂......在缺点上你需要划分每个结果.

使用smallmoney/money字段时,区域设置是否存在"货币"相关问题?这些在C#/ .NET中也会转移什么?

任何利弊?去整数价格或小钱币或其他?

你的经验告诉我什么?

lc.*_*lc. 22

如果您完全确定您的数字将始终保持在范围内smallmoney,请使用它,您可以节省几个字节.否则,我会用money.但请记住,这些天存储很便宜.超过1亿条记录的额外4个字节仍然不到半个GB.正如@marc_s指出的那样,使用smallmoneyif if可以减少SQL Server的内存占用量.

长话短说,如果你可以逃脱smallmoney,做.如果您认为自己可能超过最大值,请使用money.

但是,千万不能使用浮动小数点型或者你会得到四舍五入的问题,并会开始失去或获得随机美分,除非你正确地对付他们.

我反对使用的论点int:为什么通过存储一个int然后必须记住除以100(10000)来重新发明轮子来检索值并在你去存储值时再乘以.我的理解是货币类型无论如何都使用intlong作为底层存储类型.

至于.NET中相应的数据类型,它将是decimal(这也将避免C#代码中的舍入问题).

  • @Ic:是的,磁盘存储现在很便宜 - 但是你选择的数据类型也会直接影响SQL Server的RAM消耗 - 它将磁盘页面加载到RAM 1:1 - 没有压缩,没有移动位.因此,如果你在磁盘上浪费空间 - 你也在服务器的内存中浪费了spaec - 这并不像磁盘空间那么便宜...... (2认同)

Mit*_*eat 9

如果您要存钱,请使用Money数据类型(除非像国债一样建模大量资金) - 它避免了精确/舍入问题.

金钱的诸多好处......数据类型!

  • 没有什么是一切的最佳选择.你在处理钱.你有疑问.不想舍入错误.例如,如果你向浮子添加10 x 10美分,你会得到什么?从技术上讲,0.1*10 = 1.但是,如果在调试器中查看这些0.1的总和,则为"1.00000012".如果要将其与1进行比较,除非使用epsilon值,否则不能.http://docs.sun.com/source/806-3568/ncg_goldberg.html我怀疑速度惩罚是一个问题,除非你做的事非常密集.它仍然非常快.过早的优化毕竟是万恶之源. (2认同)
  • @Kevin"过早优化是所有邪恶的根源" - 我明白了这一点,但从一开始就考虑正确的数据结构并不是我认为的过早优化.它关于在地表下建立坚固的基础.我认为在对整个庞大的SQL数据库+大量的类实现相同类型之前,可以评估pro/cons.我的问题还在于讨论哪种情况最佳实践.所以,谢谢你的意见,我真的很高兴你的时间. (2认同)
  • 链接现已失效。尝试http://web.archive.org/web/20110406034419/http://sqlcat.com/technicalnotes/archive/2008/09/25/the-many-benefits-of-money-data-type.aspx (2认同)

nvo*_*gel 7

使用NUMERIC/DECIMAL.避免使用MONEY/SMALLMONEY.这是一个原因的例子.由于舍入错误,MONEY/SMALLMONEY类型迟早会让您失望.货币类型是完全多余的,没有任何用处 - 货币金额只是另一个十进制数字.

最后,MONEY/SMALLMONEY类型是Microsoft专有的.NUMERIC/DECIMAL是SQL标准的一部分.它们被更多人使用,识别和理解,并得到大多数DBMS和其他软件的支持.

  • @Frank:我对Informix一无所知.我的意思是MONEY是特定于供应商的扩展.它不是SQL标准的一部分. (2认同)