NUMBER(7, 0)
只是限制了值域。
它们的内部表示没有不同:
CREATE TABLE t_pk (col1 NUMBER(7, 0) NOT NULL, col2 NUMBER(38) NOT NULL)
INSERT
INTO t_pk
VALUES (9999999, 9999999)
SELECT DUMP(col1), DUMP(col2)
FROM t_pk
DUMP(col1) DUMP(col2)
--- ---
Typ=2 Len=5: 196,10,100,100,100 Typ=2 Len=5: 196,10,100,100,100
In Oracle
, the NUMBER
s 存储为归一化后的数值的百分位数0.01 <= N < 1
并加上指数。
在上面的例子中:
-
196
is the 192
基于指数 (4
).
-
10
是十进制9
-
100
是十进制的99
's
整数以十进制读为00.09 99 99 99 * (100 ^ 4) = 9,999,999
满足精度要求所需的位数越多,当然存储的位数就越多。
当您将精确值插入不太精确的列时,它只会四舍五入到列的精度并以四舍五入的方式存储。
因此,从性能角度来说,声明您的列是安全的NUMBER(38)
,因为这意味着没有开销NUMBER(7, 0)
(对于适合这两种类型的数字)。
但是,如果您的PRIMARY KEY
s 本质上是整数,您最好将精度指定为0
以确保没有小数值到达您的表。
Update:
@Mac https://stackoverflow.com/questions/1234634/oracle-primary-keys-number-vs-number7-0/1243892#1243892还指出,客户端可能依赖列数据类型来确定值域。
如果您的应用程序期望INT32
,你应该将你的号码设为NUMBER(9)
或以下(或您的客户认为可以转换为的任何类型Int32
).