私はそれを検索しましたが、私の質問に対する決定的な答えが見つかりません...
Oracleのnumber(p)フィールドのストレージサイズを知る必要があります。
例:NUMBER(1)、NUMBER(3)、NUMBER(8)、NUMBER(10)など...
使用されるストレージは、実際の数値、および列の精度と列のスケールによって異なります。
Oracle Databaseは、数値データを可変長形式で格納します。各値は科学表記法で保存され、1バイトが指数の保存に使用されます。データベースは、最大20バイトを使用して仮数を格納します。仮数は、有効数字を含む浮動小数点数の一部です。 Oracle Databaseでは、先頭と末尾のゼロは保存されません。
これを考慮すると、特定の数値データ値NUMBER(p)のバイト単位の列サイズ(pは特定の値の精度)は、次の式を使用して計算できます。
_ROUND((length(p)+s)/2))+1
_ここで、数値が正の場合、sはゼロに等しく、数値が負の場合、sは1に等しくなります。
ゼロおよび正および負の無限大(バージョン5 Oracleデータベースからのインポート時にのみ生成)は、一意の表現を使用して保存されます。ゼロおよび負の無限大にはそれぞれ1バイトが必要です。正の無限大には2バイトが必要です。
My Oracle Supportにアクセスできる場合は、ノート1031902.6に詳細情報があります。
vsize
またはdump
で使用される実際のストレージを確認できます 。
_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)
列にあるにもかかわらず、ストレージは値に応じて変化し、2つの3桁の数値が異なるストレージ量を必要とする場合があることに注意してください。
Oracleのnumber
データ型は、varchar
のような可変長の特別なデータ型です。次に、同じデータをnumber(5)
とnumber(20)
に格納する場合、ストレージはvarchar(100)
とvarchar(200)
として列を宣言するのと同じです。
したがって、number(p,s)
でpパラメーターを指定しても、ストレージサイズには影響せず、データに制約を適用するためだけです。ただし、sパラメーターを指定すると、データを丸めてサイズを小さくすることができます。
数値データ型の最小ストレージサイズは1バイトで、最大は21バイトです。したがって、制約を適用したくない場合は、pパラメーターなしでnumber
データ型を使用します。