我见过一些例子,其中decimal
在NHibernate项目中用于映射到Oracle中的整数列。现在我在我的程序中使用int
和long
。
decimal
优于int
/ long
的优势是什么?它表现得更好吗?
答案 0 :(得分:55)
我在各种示例中看到使用decimal而不是int / long。我只想了解原因
这可能是因为.NET decimal
和Oracle NUMBER
maps a bit better而不是long
和NUMBER
,这也为您提供了更大的灵活性。如果您稍后在Oracle列中添加 scale ,那么如果您已使用decimal
,则不必更改数据类型。
decimal
肯定比int
和long
慢,因为硬件支持后两者。也就是说,你必须处理一些大量的数据才能有所作为。我仍然认为你应该使用long
如果那是你正在处理的那个,那么你也应该让表列定义代表那个。 NUMBER(18,0)
long
等等。
decimal
映射得更好的原因是long
是64位而decimal
是(种类)128位。
<强> .NET 强>
键入:十进制
近似范围:±1.0×10 ^ -28至±7.9×10 ^ 28
精度:28-29位有效数字输入:长
范围:-9,223,372,036,854,775,808至9,223,372,036,854,775,807
精度:18(对于ulong为19)有效数字
<强>的Oracle 强>
NUMBER
defaults到38位有效数字,缩放0(整数)。
输入: NUMBER
范围:+ - 1 x 10 ^ -130至9.99 ... 9 x 10 ^ 125
精度:38位有效数字
Microsoft已发现此问题并notes
此数据类型是。的别名 NUMBER(38)数据类型,并且是专门设计的 以便OracleDataReader返回一个 而不是System.Decimal或OracleNumber 整数值。使用.NET 框架数据类型可以导致 溢出。
考虑到这一点,您实际上需要BigInteger
能够表示与NUMBER
默认的相同数量的有效数字。我从来没有见过有人这样做过,我认为这是一个非常罕见的需求。同样BigInteger
仍然不会削减它,因为NUMBER
可以是正无穷大。
答案 1 :(得分:38)
[.NET: Int32] = [Oracle:NUMBER(2)..NUMBER(9)*]
[.NET: Int64] = [Oracle:NUMBER(10)..NUMBER(18)*]
[.NET: Double] = [Oracle:NUMBER(x, 0)..NUMBER(x, 15)*]
[.NET: Double] = [Oracle: FLOAT]
[.NET: Decimal] = [Oracle:NUMBER]
答案 2 :(得分:12)
NUMBER(1,0) => Boolean
NUMBER(5,0) => Int16/short.MaxValue == 32767
NUMBER(10,0) => Int32/int.MaxValue == 2,147,483,647
NUMBER(19,0) => Int64/long.MaxValue == 9,223,372,036,854,775,807