我一直在使用 ORM 工具/代码生成器,我发现他们在将列映射到属性时更喜欢使用值decimal
。int
使用小数有什么好处吗?
数据库中的列类型是我相信的默认Number
值Number(38, 0)
。
我一直在使用 ORM 工具/代码生成器,我发现他们在将列映射到属性时更喜欢使用值decimal
。int
使用小数有什么好处吗?
数据库中的列类型是我相信的默认Number
值Number(38, 0)
。
NUMBER
是NUMBER(38)
,它的可能范围比int
( Int32
) 大得多(也比 大得多long
)。double
具有不同的舍入语义,因此decimal
最好避免错误和问题。如果 ORM 可以保证数据适合里面int
,它可能更容易使用int
。
十进制是 128 位数据类型。Int32 是 32 位的,对于一般用途来说太小了,因为表的行数通常会溢出 32 位 int。有些工具只是默认为 NUMBER(38) 或 Oracle 中的 INTEGER 别名,它们映射到相同的位置,有些工具采用简单的方法并使用 Decimal,而其他工具则尝试更接近地映射到相应的值范围。
考虑到 Oracle NUMBER(38) 的大小(38 位有效数字是一个很大的数字),十进制是唯一安全的选择。但是,如果您知道要存储顺序值,那么 Int64 就足够实用了,因为即使是 Decimal 也可能会因 Oracle NUMBER 而溢出。十进制最多可以容纳79,228,162,514,264,337,593,543,950,335。那是“仅” 29 位有效数字,仍然不能保持 NUMBER(38) 最大值。
如果您想要更紧密的映射,则需要在 Oracle 中使用更小精度的 NUMBER 字段。我用:
NUMBER(9) => Int32
NUMBER(18) => Int64
NUMBER(19+) => Decimal
在我编写的数据访问代码生成器中。ORM 可以做同样的事情,也可以不做。通常 NUMBER(18) 足以满足您需要的任何整数键。
如果您不使用主键进行算术运算,那么我无法想象使用 Decimal 类型会带来任何不利影响,如果您只想要“一劳永逸”而不担心不适合的值。在 OLTP 系统中,使用 Decimal 和 Int64 之间的性能差异可以忽略不计,并且 Oracle 不关心您将字段定义为 NUMBER(1) 还是 NUMBER(38) 就数据存储而言,NUMBER() 类型是像 VARCHAR 这样的可变长度类型,并且只会占用每行中特定值所需的空间。它不是固定长度的存储,因此实际上您只是在限制潜在价值,而不是节省空间。
SQL> insert into bbb values(1);
1 row created.
SQL> insert into bbb values(11111111);
1 row created.
SQL> insert into bbb values(1111111111111111111111111);
1 row created.
SQL> select i, vsize(i) from bbb;
I VSIZE(I)
---------- ----------
1 2
11111111 5
1.1111E+24 14