Ily*_*gan 45 c# oracle nhibernate nhibernate-mapping oracle10g
我已经看到了一些decimal在NHibernate项目中使用的示例,用于映射到Oracle中的整数列.现在,我使用int,并long在我的计划.
decimalover int/ long?有什么好处?它表现更好吗?
Jon*_*röm 57
我在各种例子中看到使用decimal而不是int/long.我只是想了解原因
这可能是因为.NET decimal和Oracle NUMBER 映射好一点比long和NUMBER它也给你更大的灵活性.如果您稍后在Oracle列中添加一个比例,那么如果您已经使用过,则不必更改数据类型decimal.
decimal肯定比较慢int,long因为硬件支持后两个.也就是说,你必须处理一些大量的数据才能有所作为.我仍然认为你应该使用long那个你正在处理的东西然后你也应该让表列定义代表那个.NUMBER(18,0)对long等.
decimal映射稍微好一点的原因long是64位并且decimal是(种)128位.
.净
类型:十进制
近似范围:±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(19 for ulong)有效数字
神谕
NUMBER 默认为38位有效数字,缩放0(整数).
类型:NUMBER
范围:+ - 1 x 10 ^ -130至9.99 ... 9 x 10 ^ 125
精度:38位有效数字
微软意识到了这个问题和注意事项
此数据类型是用于NUMBER(38)的数据类型的别名,并且被设计为使得OracleDataReader返回System.Decimal或OracleNumber,而不是一个整数值.使用.NET Framework数据类型可能会导致溢出.
想想看,你实际上需要BigInteger能够表示与NUMBER默认值相同的有效位数.我从来没有见过有人这样做过,我认为这是一个非常罕见的需求.同样BigInteger仍然不会削减它,因为NUMBER可以是正无穷大.
Hom*_*mam 39
[.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]
Run Code Online (Sandbox Code Playgroud)
Car*_*man 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
Run Code Online (Sandbox Code Playgroud)