【发布时间】:2011-02-27 03:13:06
【问题描述】:
我想知道对于类似商店的结构,SQL Server 中价格字段的最佳类型是什么?
看看this overview,我们有称为money、smallmoney的数据类型,然后是decimal/numeric,最后是float 和真实的。
名称、内存/磁盘使用情况和值范围:
- 金钱: 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?
- 整数: 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 中也会转移什么?
任何优点/缺点?选择整数价格还是 smallmoney 或其他?
你的经历说明了什么?
【问题讨论】:
-
感谢您的所有回答!我有一种感觉,我们可能也会以这些结果结束。所以我很高兴你已经为我确认了这一点。我想我们会先从 smallmoney 开始。与其说是“存储空间”(价格),不如说是从磁盘反复传输到内存的数量或数据+每次连接和求和将有 4 个额外的字节来处理钱而不是小钱。所以我会看看我找到最好的答案,然后投票给你们中的一些人!感谢人们!真的!它的appriciated!
-
用钱带来的四舍五入问题不容忽视。 @sqlvogel 的回答非常重要。
标签: c# sql-server linq-to-sql database-design query-optimization