Oracle NUMBER(p) 存储大小是多少?

28

我搜索了一下,但是没有找到对我的问题的确切答案...

我需要知道Oracle中数字(p)字段的存储大小。

例如:NUMBER(1),NUMBER(3),NUMBER(8),NUMBER(10)等...

3个回答

43

存储使用量取决于实际数值,以及列的精度和比例。

根据Oracle 11gR2概念指南,Oracle数据库以可变长度格式存储数字数据。每个值都以科学计数法存储,使用1个字节来存储指数。数据库最多使用20个字节来存储尾数,即包含有效数字的浮点数的部分。Oracle数据库不存储前导零和尾随零。

10gR2指南进一步说明

考虑到这一点,对于特定数字数据值NUMBER(p),其中p是给定值的精度,可以使用以下公式计算列大小(以字节为单位):

ROUND((length(p)+s)/2))+1

如果数字为正数,则s等于零,如果数字为负数,则s等于1。

零、正无穷和负无穷(仅在从版本5的Oracle数据库导入时生成)使用唯一表示法存储。零和负无穷每个需要1字节;正无穷需要2字节。

如果您可以访问My Oracle Support,则可以在笔记1031902.6中获得更多信息。

您可以使用vsizedump查看实际使用的存储

create table t42 (n number(10));

insert into t42 values (0);
insert into t42 values (1);
insert into t42 values (-1);
insert into t42 values (100);
insert into t42 values (999);
insert into t42 values (65535);
insert into t42 values (1234567890);

select n, vsize(n), dump(n)
from t42
order by n;

          N   VSIZE(N)                           DUMP(N) 
------------ ---------- ---------------------------------
         -1          3           Typ=2 Len=3: 62,100,102 
          0          1                  Typ=2 Len=1: 128 
          1          2                Typ=2 Len=2: 193,2 
        100          2                Typ=2 Len=2: 194,2 
        999          3           Typ=2 Len=3: 194,10,100 
      65535          4          Typ=2 Len=4: 195,7,56,36 
 1234567890          6   Typ=2 Len=6: 197,13,35,57,79,91 

请注意,存储空间取决于值的大小,尽管它们都在一个 number(10) 列中,两个三位数可能需要不同数量的存储空间。


3
谢谢你向我介绍dump函数!它帮助我调试一些奇怪的Oracle(客户端库)错误。 - Evgeniy Berezovsky
老话题了,但是...是否有一个类似的问题适用于Sql Server DECIMAL和NUMERIC类型? - coutier eric

2
NUMBER  
999...(38 9's) x10125 
maximum value   Can be represented to full 38-digit precision (the mantissa).

-999...(38 9's) x10125 
minimum value   Can be represented to full 38-digit precision (the mantissa).


Precision   38 significant digits    ==> NUMBER(38) is the max

请参考这里,也可以参考这里


1
谢谢回答。但是我该如何计算一个三位数占用多少字节? - alex_pt

1
在Oracle中,number数据类型是一种特殊的数据类型,与varchar一样具有可变长度。如果您将相同的数据存储在number(5)number(20)中,则存储大小相同,就像声明列为varchar(100)varchar(200)一样。
因此,在number(p,s)中指定p参数对存储大小没有影响,仅用于对数据应用约束。但是,指定s参数可以通过四舍五入数据来减小大小。
number数据类型的最小存储大小为1字节,最大为21字节。因此,如果不想应用约束,则使用没有p参数的number数据类型即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接