代码之家  ›  专栏  ›  技术社区  ›  BerggreenDK

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

  •  27
  • BerggreenDK  · 技术社区  · 14 年前

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

    看着 this overview 我们调用了数据类型 , 货币型 然后我们有 十进制/数字 最后 浮动 真实的 .

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

    • 金钱: 8字节(值:-922337203685477.5808到+922337203685477.5807)
    • Smallmoney: 4字节(值:-214748.3648到+214748.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字节(值:-2147483648到2147483647)

    假设一个商店使用美元,他们有美分,但我看不到价格是49.2142342美元,所以使用大量显示美分的小数似乎浪费了SQL带宽。其次,大多数商店的价格都不会接近20万美元(至少在普通的网上商店不会,除非有人想卖给我一座巴黎著名的塔楼)。

    那为什么不试试内景呢?

    一个int很快,只有4个字节,你可以很容易地做小数,方法是用美分代替美元保存值,然后在你呈现值时进行除法。

    另一种方法是使用4字节的smallmoney,但这将需要CPU的数学部分进行计算,其中as int是整数幂…不利的是,你需要将每个结果分开。

    使用smallmoney/money字段时,区域设置是否存在与“货币”相关的问题?这些在c/.net中也会转移什么?

    有什么利弊吗?去买整型的价格或者小钱或者其他的?

    你的经历说明了什么?

    7 回复  |  直到 11 年前
        1
  •  21
  •   lc.    14 年前

    如果你确信你的数字总是在 smallmoney ,使用它可以保存几个字节。否则,我会使用 money . 但请记住,现在的储存很便宜。额外的4个字节 1亿条记录 仍小于半GB。正如@marc_指出的那样,使用 货币型 如果可以,可以减少SQL Server的内存占用。

    长话短说,如果你能摆脱 货币型 做吧。如果你认为你 可以 超过最大值,使用 .

    但是,做 使用浮动小数类型,否则您将遇到舍入问题,并且将开始损失或获得随机分,除非您正确处理它们。

    我反对使用 int :为什么要通过存储 int 然后必须记住除以100(10000)来检索值,并在存储值时进行相乘。我的理解是货币类型使用 int long 作为底层存储类型。

    只要.NET中对应的数据类型 decimal (这也可以避免C代码中的舍入问题)。

        2
  •  9
  •   Mitch Wheat    14 年前

    使用 Money 数据类型:如果你在存钱(除非像国债那样为巨额资金建模),它可以避免精度/舍入问题。

    The Many Benefits of Money…Data Type!

        3
  •  7
  •   nvogel    14 年前

    使用数字/小数。避免金钱/小钱。 Here's an example of why . 由于舍入错误,money/smallmoney类型迟早会让您失望。货币类型是完全多余的,没有任何用处——货币量只是另一个十进制数字,和其他数字一样。

    最后,money/smallmoney类型是微软专有的。数字/小数是SQL标准的一部分。它们被更多的人使用、识别和理解,并且得到大多数DBMS和其他软件的支持。

        4
  •  4
  •   gbn    14 年前

    就我个人而言,我会用小钱或小钱来存储商店的价格。

    使用int在其他地方增加了复杂性。

    2亿韩元或印尼卢比也是完全有效的价格。

        5
  •  3
  •   code4life    14 年前

    SQL数据类型 money smallmoney 两个都决定了C# decimal 类型:

    http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqlmoney(v=VS.71).aspx

    所以我想你还是去 十进制的 . 我个人一直在使用 double 我一生都在金融行业工作,没有经历过绩效问题等。实际上,我发现对于某些计算等,拥有更大的数据类型可以实现更高的准确性。

        6
  •  1
  •   Craig T    14 年前

    我会选择money数据类型。诚然,你可能不会超过小额货币的价值,但多个项目很容易超过它。

        7
  •  0
  •   Joe R.    14 年前

    在我的当铺应用程序中,当铺运营商从5.00美元贷款到10000.00美元。 当他们计算贷款金额时,他们把它四舍五入到最近的一美元,以便 避免处理分(同样适用于利息支付)。当贷款金额超过50.00美元时,他们会将其四舍五入到最接近的5.00美元(即50美元、55美元、60美元等),以尽量减少美元的用完。因此,我使用十进制(7,2)表示事务。计算出的贷款额和十进制(5,0)表示事务。贷款额。 该应用程序计算贷款金额到便士,并将该金额放入贷款金额中,在低于50美元时四舍五入到最接近的美元,在高于50美元时四舍五入到最接近的美元。