.NET decimal与SQL Server decimal的良好映射是什么?

43

我需要将一些C#代码与SQL Server进行接口对接,我想在将值存储到数据库中时,与我的C#代码所使用的精度完全相同。我在C#中使用了.NET的decimal类型来表示该值。那么在SQL Server中,我应该使用哪种数据类型和精度来表示此值呢?

我知道 SQL Server 的decimal类型很可能适合我的需求,但我的问题是,为了与.NET的decimal类型匹配,我应该使用什么标度(scale)和精度(precision)?


+1 很好的问题!8个月前我也想在SO上问同样的问题,但是我完全忘记了! - spong
6个回答

28

Fluent nHibernate将System.Decimal映射为

decimal(19, 5)

2
顺便说一下,money 是 decimal(19,4)。 - Stefan Steiger

16
您可以使用SQL Server的decimal类型(文档在此)。它允许您为数据库中的数字指定精度和比例,您可以将其设置为与C#代码相同。
然而,您的问题似乎是关于将.NET decimal类型映射到SQL Server decimal类型。不幸的是,这并不是直接的。在最大精度下,SQL Server decimal类型涵盖了从-1038+1到1038-1的范围。然而,在.NET中,它可以覆盖任何从±10−28到±7.9×1028的数字,具体取决于数字。
原因是,内部上,.NET非常类似于浮点数来处理小数——它将其存储为一对数字,即尾数和指数。如果您有一个特别大的尾数,您将失去一些精度。实质上,.NET允许您混合具有高低比例的数字;SQL Server要求您提前为给定的列选择比例。
简而言之,您需要决定您的目的地十进制值的有效范围,并确保您的程序和数据库都可以处理它。无论如何,您都需要为您的程序这样做(如果您混合像10−28和7.9×1028这样的值,您不能依赖于十进制类型)。

4
我需要翻译的内容是:“我想知道在 SQL Server 中,为了使其精度与 .NET 的 decimal 类型相同,我应该使用什么样的 precisionscale 值?(请注意,1.25 和 1.250 的问题对我们不相关。)” - Earlz

4

是的,.NET Decimal 转 SQL Decimal 应该没问题。 - Riaan
3
SQL Server中的decimal精度应该是多少?默认值似乎是(18,0),这显然不是我想要的。 - Earlz

1

福利链接已经失效,但可以在这里阅读:http://web.archive.org/web/20101223234827/http://sqlcat.com/technicalnotes/archive/2008/09/25/the-many-benefits-of-money-data-type.aspx - Stefan Steiger

1
C# 的 decimal 类型大小为 128 位(16 字节)。在 SQL Server 中,如果您指定精度介于 20-28 之间,则会使用 13 个字节进行存储。如果您指定精度介于 29-38 之间,则会使用 17 个字节进行存储。为了使您的数据库能够存储 .NET 的 decimal 类型的所有可能值范围,您必须使用 SQL Server 的 decimal 类型,并将最小精度设置为 29。因为任何精度介于 29 和 38 之间的精度都将使用相同数量的字节进行存储(17),所以选择 38 作为精度是符合您利益的。
C# 的 decimal 类型允许您在不事先指定小数点前后使用的精度的情况下使用它。在 SQL Server 中,您没有这种奢侈。刻度的决定完全取决于您的要求,但您必须做出该决定,因为如果您不指定刻度,则默认为 0,您将无法存储浮点数。

如果你需要确保能够存储整个.NET十进制范围,上述内容是正确的。

如果你在应用程序中使用C#的十进制来处理货币,我认为Decimal(19, 4)就足够了。


0

简而言之,C# decimal是一个128位浮点精度数,它在Sql Server中没有精确等价物。

也许在未来的Sql Server版本中,微软会协调两种产品并支持一种直接将128位浮点精度数(clr / c# decimal等效)持久化到其数据库服务器上的方法。

我在处理非常大和非常小的数量时遇到了这个分析问题。 在我的情况下,我解决方案中所有比较数量都在64位范围内 [c# double / sql float] 能够处理。因此,在处理数量时,我选择使用[c# double / sql float],而在处理解决方案财务部分时,我选择使用[c# decimal / sql money]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接