哪种.NET数据types最适合映射NHibernate中的NUMBER Oracle数据types?

我已经看到了一些例子,在NHibernate项目中使用decimal来映射到Oracle中的整数列。 现在我在我的程序中使用intlong

int / long什么优点吗? 它performance更好吗?

我已经看到在各种示例中使用十进制而不是int / long。 我只是想明白为什么

这可能是因为.NET decimal和Oracle NUMBER 映射比longNUMBER 好一点,它也给了你更多的灵活性。 如果你在以后的阶段在Oracle列中添加一个比例 ,那么如果你已经使用了decimal那么你不需要改变数据types。

decimal肯定比int更慢,并且由于后两者在硬件上得到支持。 也就是说,你必须仔细研究一些严重的数据,才能有所作为。 我仍然认为你应该使用long如果这就是你正在处理的,那么你也应该让表列定义表示。 NUMBER(18,0)等等。

decimal图的好处是long 64位, decimal位128位。

。净

types: 十进制
大致范围:±1.0×10 ^ -28到±7.9×10 ^ 28
精确度:28-29位有效数字

types:
范围:-9,223,372,036,854,775,808至9,223,372,036,854,775,807
精度:18位(ulong为19位)有效数字

神谕

NUMBER 默认为38位有效数字和0(整数)。

types: NUMBER
范围:±1×10 ^ -130到9.99 … 9×10 ^ 125
精度:38位有效数字

微软意识到这个问题和笔记

此数据types是NUMBER(38)数据types的别名,并且被devise为使OracleDataReader返回System.Decimal或OracleNumber,而不是整数值。 使用.NET Framework数据types可能会导致溢出。

来想一想,你实际上需要BigInteger能够表示相同数量的有效数字,以及NUMBER默认的数字。 我从来没有见过任何人这样做,我想这是一个非常罕见的需要。 另外BigInteger仍然不会削减它,因为NUMBER可以是正面和负面的无限。

 [.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] 
 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