Oracle NUMBER型:最大桁数と範囲を徹底理解する
Oracleデータベースで数値を扱う際に最も一般的で重要なデータ型の一つがNUMBER
型です。このNUMBER
型は、整数から浮動小数点数まで、非常に幅広い数値を柔軟に格納できます。しかし、その柔軟さゆえに、最大桁数や範囲、そして宣言時の精度(Precision)とスケール(Scale)の関係について、正確な理解が欠かせません。特に、厳密な精度が求められる業務システムでは、これらの特性を把握しておかないと、意図しないデータの丸めやエラーが発生する可能性があります。
本記事では、OracleのNUMBER
型が持つ「最大桁数」と「範囲」に焦点を当て、その定義、内部的な仕組み、宣言方法による挙動の違い、そして利用上の注意点について、詳細かつ網羅的に解説します。約5000語を目標に、具体例を交えながら深く掘り下げていきましょう。
1. はじめに:Oracle NUMBER型の役割と重要性
データベースは様々な種類のデータを扱いますが、その中でも数値データは非常に重要です。特に、金額、数量、評価値、測定データなど、正確な計算や比較が必要な情報は数値として格納されます。
Oracle Databaseにおける数値データ型にはいくつか種類がありますが、NUMBER
型は最も汎用的で、デフォルトの数値型として推奨されることが多いです。その最大の特長は、正確な10進数精度をサポートしている点にあります。これは、多くの商用アプリケーション、特に金融システム、会計システム、在庫管理システムなどで不可欠な特性です。
なぜ正確な10進数精度が必要なのでしょうか? 例えば、通貨の計算を考えてみましょう。0.1
という数値は、多くのプログラミング言語やデータベースシステムで採用されているバイナリ浮動小数点数形式(IEEE 754など)では、正確に表現することができません。わずかな誤差を含む近似値として表現されるため、0.1
を10回足しても厳密に1.0
にならないといった問題が発生することがあります。このような誤差は、金融取引や会計処理においては許容されません。
一方、OracleのNUMBER
型は、数値を内部的に10進数(基数100)として表現するため、0.1
のような10進小数を正確に格納・計算できます。これにより、計算誤差を排除し、信頼性の高いデータ処理を実現しています。
このNUMBER
型を扱う上で、その能力の限界を示す「最大桁数」と「範囲」は非常に重要な概念です。次章から、これらの概念について詳しく見ていきます。
2. NUMBER型の基本:宣言とp、sの意味
NUMBER
型は、テーブルのカラム定義やPL/SQL変数の宣言において、以下の3つの形式で指定できます。
NUMBER
NUMBER(p)
NUMBER(p, s)
ここで登場する p
と s
が、NUMBER
型の特性を決定づける重要な要素です。
-
p
(Precision – 精度)- 数値全体の有効桁数を指定します。小数点を含む全ての桁数です。
- 指定できる値は 1から38 までの整数です。
NUMBER
またはNUMBER(*, s)
のように精度を指定しない場合、Oracleはデフォルトで最大の38桁を精度として扱います。- 精度は、そのデータ型が格納できる数値の「精密さ」、すなわち何桁まで正確に表現できるかを示します。
-
s
(Scale – スケール)- 小数点以下の桁数を指定します。
- 指定できる値は -84から127 までの整数です。
NUMBER(p)
のようにスケールを指定しない場合、Oracleはデフォルトでスケール0として扱います(整数のみを格納)。- スケールは、小数点位置と、小数点以下(または左側)の桁数をどのように扱うかを示します。
これらのp
とs
の組み合わせによって、NUMBER
型に格納できる数値の特性(特に小数点位置や丸め規則)が決まります。ただし、後述するように、NUMBER
型が格納できる数値の絶対的な範囲は、p
とs
の指定だけでなく、内部表現によって別途決まります。
3. 最大桁数 (Precision, p) の詳細
Oracle NUMBER
型の「最大桁数」とは、前述の通り精度p
の最大値であり、それは38です。これは、NUMBER
型が表現できる有効桁数が最大で38桁であることを意味します。
有効桁数とは、数値の中で意味を持つ桁のことです。例えば、123.4500
という数値の有効桁数は5桁(1, 2, 3, 4, 5)であり、末尾のゼロは通常有効桁数に含めません。ただし、NUMBER
型の精度p
は、小数点を含む数値全体の桁数として解釈されることが多く、特に NUMBER(p, s)
の場合は p
は「小数点を含めた最大表示桁数」に近いニュアンスを持ちます。
NUMBER(p, s)
における精度p
の具体的な意味合いは、以下のようになります。
- 数値全体の桁数が
p
を超える場合、格納時にエラーが発生します。 - 数値が格納される際、スケール
s
に従って丸めが行われますが、丸め後の有効桁数がp
を超えることは許されません。
例を見てみましょう。
“`sql
— 精度10、スケール2のNUMBER型
CREATE TABLE products (
price NUMBER(10, 2)
);
— 12345678.90 を挿入 (整数部8桁 + 小数部2桁 = 合計10桁、精度10に収まる)
INSERT INTO products (price) VALUES (12345678.90); — 成功
— 123456789.01 を挿入 (整数部9桁 + 小数部2桁 = 合計11桁、精度10を超える)
INSERT INTO products (price) VALUES (123456789.01);
— ORA-01438: value larger than specified precision allowed for this column
“`
このように、NUMBER(p, s)
では、小数点より左側の桁数は p - s
を超えてはなりません。上記の例では、p=10
, s=2
なので、整数部は 10 - 2 = 8
桁まで許容されます。123456789.01
は整数部が9桁なのでエラーになります。
3.1. 精度無指定 (NUMBER
) の場合
NUMBER
とだけ宣言した場合、Oracleは精度を最大の38桁として扱います。スケールは格納される値によって可変となります。例えば、123.45
を格納すればスケールは2として扱われますし、123456789012345678901234567890.12345678
(38桁の整数部と8桁の小数部) のような値を格納すれば、スケールは8として扱われます。ただし、全体で38桁の精度制限は常に適用されます。
この形式は非常に柔軟ですが、厳密な小数点以下の桁数を固定したい場合には不向きです。そのような場合は、明示的にNUMBER(p, s)
形式を使用すべきです。
3.2. 38桁を超える数値を格納しようとした場合の挙動
前述の通り、NUMBER
型で表現できる有効桁数は最大38桁です。これを超える有効桁数を持つ数値を格納しようとすると、原則としてORA-01438
エラーが発生します。
ただし、格納しようとする数値が列定義のスケールs
に基づいて丸められた結果、有効桁数が精度p
内に収まる場合は、エラーにはならず丸められて格納されます。
例:
“`sql
— 精度5、スケール2のNUMBER型
CREATE TABLE test_rounding (
value NUMBER(5, 2)
);
— 小数点以下第3位まで持つ値を挿入
INSERT INTO test_rounding (value) VALUES (123.456);
— 挿入成功。スケール2に合わせて四捨五入され、123.46 が格納される。
— 123.46 は整数部3桁 + 小数部2桁 = 5桁で、精度5に収まる。
— 丸めによって精度を超えるケース
INSERT INTO test_rounding (value) VALUES (999.995);
— スケール2に合わせて四捨五入すると 1000.00 になる。
— 1000.00 は整数部4桁 + 小数部2桁 = 6桁となり、精度5を超える。
— ORA-01438: value larger than specified precision allowed for this column
“`
この丸めの挙動は、特に負のスケールの場合に重要になります(後述)。
4. 範囲 (Range) の詳細
Oracle NUMBER
型が扱える「範囲」は、前述の「精度」とは少し異なる側面です。範囲は、表現できる数値の絶対的な大きさの上限と下限を示します。
4.1. 理論的な絶対範囲
Oracle NUMBER
型の最大の特長の一つは、その非常に広い範囲です。NUMBER
型は、約 -10^126
から +10^126
までの数値を格納できます(ゼロを含む)。
この範囲は、多くのプログラミング言語で使われる標準的な浮動小数点型(float
やdouble
)の範囲(±10^38
~ ±10^308
程度)と比較しても非常に広いです。特に、double
型のような表現可能な最大値に比べれば狭いですが、float
型よりは広い範囲をカバーしています。
この広い範囲は、NUMBER
型が内部的に指数部と仮数部(基数100)を持つ可変長形式で数値を格納していることに由来します。この内部表現については後述しますが、指数部が非常に大きな範囲を表現できるため、全体の数値範囲が広くなっています。
ただし、この約 ±10^126
という範囲はあくまで格納可能な数値の絶対的な上限・下限です。この範囲内の数値であっても、列定義の精度p
を超える有効桁数を持つ数値は、格納時にエラーになるか、丸められて精度内に収まる形になります。
4.2. スケール (s
) が範囲(実質的な最大値・最小値)に与える影響
NUMBER(p, s)
形式で宣言された場合、スケールs
は小数点以下の桁数を指定しますが、これは同時に、そのデータ型が表現できる数値の実質的な最大値と最小値にも影響を与えます。これは、精度p
とスケールs
によって、小数点位置と有効桁数の制約が決まるためです。
NUMBER(p, s)
で格納できる正の最大値は、直感的には「p - s
桁の9が小数点より左に並び、s
桁の9が小数点より右に並ぶ数」です。
-
s > 0
(正のスケール)- 小数点以下に
s
桁を確保します。 - 整数部は
p - s
桁まで表現できます。 - 格納できる数値の絶対値は、約
10^(p-s)
未満に制限されます(正確には10^(p-s) - 10^(-s)
が最大値に近い)。 - 例:
NUMBER(5, 2)
p=5
,s=2
- 整数部
5 - 2 = 3
桁まで。 - 格納できる最大値は約
999.99
(10^(5-2) - 10^(-2) = 1000 - 0.01 = 999.99
) - 格納できる最小値は約
-999.99
- 小数点以下に
-
s = 0
(ゼロスケール)- 小数点以下を許可しません(整数のみ)。
- 整数部は
p
桁まで表現できます。 - 格納できる数値の絶対値は、約
10^p
未満に制限されます(正確には10^p - 1
が最大値)。 - 例:
NUMBER(5, 0)
またはNUMBER(5)
p=5
,s=0
- 整数部
5 - 0 = 5
桁まで。 - 格納できる最大値は
99999
(10^5 - 1
) - 格納できる最小値は
-99999
-
s < 0
(負のスケール)- 小数点より左側の桁で丸めが行われます。
-s
は小数点より左側何桁目で丸めるかを示します(例えばs = -2
は百の位で丸め)。 - 整数部は
p - s
桁まで表現できるように見えますが、精度p
と丸めの組み合わせによって実質的な最大値が決まります。格納できる数値は、末尾-s
桁が0で、かつ有効桁数がp
に収まる形式になります。 - 例:
NUMBER(5, -2)
p=5
,s=-2
- 小数点より左側2桁目(百の位)で丸め。末尾2桁は0になります。
- 格納できる最大値は、有効桁数5桁で末尾2桁が0の最大値、つまり
99900
です。 - 格納できる最小値は
-99900
です。 - この型に
123456
を挿入すると123500
に丸められます(有効桁数5、末尾2桁0)。 - この型に
99950
を挿入すると100000
に丸められますが、これは有効桁数1の後ろに0が5つ続く形式となり、全体の桁数が多すぎるためORA-01438
エラーになります(精度5の制約)。
- 小数点より左側の桁で丸めが行われます。
-
NUMBER
(精度・スケール無指定)- 精度38として扱われます。
- スケールは格納される値によって変動します(最大127まで)。
- 理論的な絶対範囲である約
±10^126
までの値を格納できます(ただし有効桁数は38に制限されます)。
4.3. スケールによる丸め(Rounding)の詳細
NUMBER(p, s)
列に値を挿入または更新する際、Oracleは指定されたスケールs
に基づいて値を丸めます。
-
s > 0
: 小数点以下第s+1
位で四捨五入が行われます。NUMBER(10, 2)
に123.4567
->123.46
NUMBER(10, 4)
に123.45678
->123.4568
-
s = 0
: 小数点以下第1位で四捨五入が行われます。NUMBER(5, 0)
に123.5
->124
NUMBER(5, 0)
に123.4
->123
-
s < 0
: 小数点より左側、-s
桁目の位置で四捨五入が行われ、末尾-s
桁はゼロになります。NUMBER(5, -2)
に123456
->123500
(十の位で四捨五入)NUMBER(5, -2)
に123449
->123400
(十の位で四捨五入)NUMBER(5, -1)
に12345
->12350
(一の位で四捨五入)
丸めの結果、有効桁数が精度p
を超える場合は、ORA-01438
エラーが発生します。これは特に負のスケールの場合に注意が必要です。例えば、NUMBER(2, -2)
に 50
を挿入すると、百の位で丸められ 100
になりますが、これは精度2(有効桁数2)を超えていないため格納可能です。しかし、NUMBER(2, -2)
に 51
を挿入すると、丸められて 100
になり、これも格納可能です。NUMBER(2, -2)
に 149
を挿入すると 100
に、150
を挿入すると 200
に丸められます。これらの例では有効桁数が1桁または2桁であり、精度2に収まっています。
しかし、NUMBER(2, -2)
に 9949
を挿入すると 9900
に丸められ、有効桁数2で精度2に収まるので格納可能です。NUMBER(2, -2)
に 9950
を挿入すると 10000
に丸められます。これは有効桁数1桁ですが、全体として5桁の数値であり、精度2の定義から期待される数値の大きさを遥かに超えています。したがって、ORA-01438
エラーが発生します。丸め後の「見かけ上の桁数」と「有効桁数」の関係、そして精度p
による制約を理解することが重要です。
4.4. アンダーフローとオーバーフロー
Oracle NUMBER
型は広い範囲を持つため、一般的なアプリケーションではオーバーフロー(正の最大値を超える)やアンダーフロー(ゼロに近すぎて表現できない)に遭遇することは少ないです。
- オーバーフロー: 約
+10^126
を超える値、または約-10^126
より小さい(大きな負の)値を格納しようとすると、オーバーフローが発生し、ORA-01426: numeric overflow
エラーが発生します。Oracleは他のシステムのように無限大(Infinity)のような特殊な値を格納するのではなく、エラーとして扱います。 - アンダーフロー: ゼロに非常に近い非ゼロ値(例えば
10^-131
のオーダー)を格納しようとすると、アンダーフローが発生し、その値はゼロとして格納される可能性があります。これは精度38で表現できる最小の非ゼロ値よりも絶対値が小さい場合に起こります。
ただし、前述のように、これらの絶対的な範囲限界よりも、NUMBER(p, s)
定義における精度p
による制限に抵触してORA-01438
エラーが発生するケースの方が一般的です。
5. NUMBER型の内部表現:範囲と精度の根拠
Oracle NUMBER
型が、なぜ38桁の精度と約 ±10^126
の範囲という特性を持つのかは、その内部表現に深く関連しています。NUMBER
型は、固定長ではなく、格納する値に応じて必要なバイト数を使用する可変長のデータ型です。
内部的には、数値は符号、指数、そして基数100の仮数部(Mantissa)に分解されて格納されます。
- 符号: 数値が正か負かを示します。
- 指数部: 数値の大きさを表します。基数100を使用し、オフセットを加えて格納されます。この指数部の範囲が、
NUMBER
型が表現できる約±10^126
という絶対的な範囲を決定しています。指数部は通常1バイトで表現されます。 - 仮数部: 数値の有効数字部分を表します。基数100の桁の並びとして格納されます。1つの基数100の桁は、0から99までの値を持ち、これは10進数2桁に相当します。38桁の10進数を表現するためには、最大で38/2 = 19個の基数100の桁が必要です(小数点位置や符号、指数によっては最大20個のバイトが必要になることもあります)。仮数部は、必要な有効桁数に応じてバイト数を消費します。
この基数100の仮数部表現が、NUMBER
型が10進数として正確な計算を保証できる理由です。他の多くのシステムが基数2(バイナリ)で浮動小数点数を表現するのに対し、Oracle NUMBER
型は基数100を使用することで、10進小数を正確に表現できるのです。
格納に必要なバイト数は、符号、指数、そして仮数部を合わせたバイト数になります。小さな整数(例: 10)であれば数バイトで済みますが、大きな数値や小数点以下の桁数が多い数値ほど多くのバイトを消費します。最大で22バイト程度になります(ヘッダ1 + 指数部1 + 仮数部最大20)。
この可変長特性は、ストレージを効率的に使用できるという利点がありますが、固定長データ型と比較すると、値を読み書きする際に必要な領域を特定するためのオーバーヘッドがわずかに発生します。しかし、このオーバーヘッドは通常、現代のシステムではパフォーマンス上のボトルネックになることはほとんどありません。
38桁という精度の最大値は、この内部的な仮数部の表現能力に由来しています。Oracleは、この形式で最大38桁までの10進数を正確に格納・計算できるように設計されています。
6. p
と s
の関係と特別な指定
NUMBER(p, s)
形式で宣言する際のp
とs
の指定には、いくつかの特別なケースや考慮事項があります。
6.1. s > p
のケースの深掘り
s > p
のケース、例えば NUMBER(2, 5)
のような定義は、一見直感的ではありません。これは「有効桁数全体は2桁だが、小数点以下は5桁確保する」という意味になります。
このような場合、整数部は p - s = 2 - 5 = -3
桁となります。これは、「小数点より左側には有効な非ゼロ桁は存在しない」ことを意味します。格納できる数値は、0.00xxx
の形式となり、その中でも有効桁数が2桁(すなわち、小数点以下の非ゼロ桁が最大2つ)の数値に制限されます。
例: NUMBER(2, 5)
に数値を格納
“`sql
— 精度2、スケール5のNUMBER型
CREATE TABLE test_s_gt_p (
val NUMBER(2, 5)
);
— 0.01234 を挿入
INSERT INTO test_s_gt_p (val) VALUES (0.01234);
— 小数点以下5桁まで考慮。有効桁数は1234の4桁。精度2を超えるため、丸め対象。
— スケール5なので小数点以下第6位で四捨五入。今回の値は第6位がない。
— 全体の有効桁数を2桁に収めるため、0.01234 -> 0.012 に丸められるべきか?
— 実際には、精度pに従い、スケールsで四捨五入した結果が格納されます。
— 0.01234 -> 小数点以下第6位はないので丸めなし -> 0.01234
— 格納時に精度2が適用される。有効桁数が2桁になるよう丸められる。
— 0.01234 の有効桁数は 1, 2, 3, 4 の 4桁。精度2を超える。
— Oracleはこれを 0.0123 に丸める (小数点以下第5位で四捨五入)。有効桁数1,2,3, これは3桁。まだ精度2を超える。
— さらに丸めて 0.012 (有効桁数1,2, これは2桁)。精度2に収まる。
— 結果: 0.012 が格納されます。(正確な内部的な丸め規則はもう少し複雑ですが、概念としてはこうなります)
INSERT INTO test_s_gt_p (val) VALUES (0.000127);
— 小数点以下第6位の7を四捨五入 -> 0.00013
— 有効桁数1, 3の2桁。精度2に収まる。
— 結果: 0.00013 が格納されます。
INSERT INTO test_s_gt_p (val) VALUES (0.000009);
— 有効桁数9の1桁。精度2に収まる。
— 結果: 0.000009 が格納されます。
INSERT INTO test_s_gt_p (val) VALUES (0.0000001);
— 有効桁数1の1桁。精度2に収まる。
— 結果: 0.0000001 が格納されます。
INSERT INTO test_s_gt_p (val) VALUES (0.123);
— 有効桁数1,2,3の3桁。精度2を超える。
— 丸めて 0.12 (有効桁数2)。精度2に収まる。
— 結果: 0.12 が格納されます。
INSERT INTO test_s_gt_p (val) VALUES (0.00000001);
— 有効桁数1の1桁。精度2に収まる。
— 結果: 0.00000001 が格納されます。
INSERT INTO test_s_gt_p (val) VALUES (1.23);
— 有効桁数3桁。精度2を超える。
— ORA-01438: value larger than specified precision allowed for this column
“`
s > p
の場合、格納できる非ゼロの数値は絶対値が1未満となります。実質的には、小数点以下のs
桁の中で、先頭の非ゼロ桁から数えてp
桁目までが有効になるような数値のみが格納可能です。小数点以下の非ゼロ桁の並びがp
桁に満たない非常に小さな数値も格納できます。これは、非常に小さな数値を限定された精度で扱う場合に利用される可能性があります。
6.2. NUMBER(*, s)
の指定
NUMBER(*, s)
の形式も指定可能です。この場合、精度p
はアスタリスク*
で指定され、Oracleがその列に格納される値に応じて最適な精度を使用します。実質的には、最大の精度38として扱われることが多いですが、Oracleの内部的な最適化によって、より効率的な表現が選択されることもあります。
スケールs
は明示的に指定されるため、小数点以下の桁数と丸め規則は固定されます。
例: NUMBER(*, 2)
* 格納できる数値の精度は最大38桁です。
* 小数点以下2桁で丸めが行われます。
* 整数部は最大 38 - 2 = 36
桁まで格納可能です。
* 範囲は、約 ±10^126
の絶対範囲内で、小数点以下2桁に丸められた形式の数値です。
NUMBER(*, s)
は NUMBER(38, s)
と非常に似ていますが、NUMBER
(無指定) のように計算結果のスケールが柔軟に扱われる場合がある点が異なります。通常は、明示的なNUMBER(p, s)
または NUMBER
が推奨されます。
7. NUMBER型のストレージとパフォーマンス
前述の通り、NUMBER
型は可変長です。格納される数値の大きさによって使用するバイト数が異なります。
- 正の値: 符号バイト1 + 指数バイト1 + 仮数部バイト数
- 負の値: 符号バイト1 + 指数バイト1 + 仮数部バイト数 + 1 (補数のため)
- ゼロ: 1バイトまたは2バイト(Oracleバージョンによる)
仮数部が必要とするバイト数は、表現する10進数の桁数によって決まります。概ね、10進数2桁あたり1バイト(基数100の1桁)が必要です。最大38桁の10進数を表現するためには、約20バイトの仮数部が必要です。したがって、NUMBER
型が消費する領域は最大で約22バイトとなります。
NUMBER(p, s)
のように精度とスケールを明示的に指定しても、実際に使用されるストレージ領域は格納される値そのものに依存します。NUMBER(10, 2)
で123.45
を格納する場合と、NUMBER(20, 5)
で123.45
を格納する場合で、使用されるストレージサイズはほとんど同じです。列定義のp
とs
は、格納できる値の制約として機能し、ストレージサイズそのものを固定するわけではありません。
パフォーマンスの観点では、NUMBER
型は可変長であること、および10進数演算を行うことから、固定長かつバイナリ演算を行うBINARY_FLOAT
やBINARY_DOUBLE
と比較して、わずかに処理コストがかかる場合があります。しかし、現代の高速なCPUとストレージにおいては、この差が顕著なパフォーマンス問題となるケースは稀です。正確な10進数計算が要求される業務においては、パフォーマンスのわずかな差よりも精度の正確さの方がはるかに重要であるため、NUMBER
型が推奨されます。
8. NUMBER型利用のベストプラクティスと注意点
- 適切な精度とスケールを選択する: アプリケーションの要件に基づいて、必要な最大値、最小値、小数点以下の桁数を考慮し、適切な
NUMBER(p, s)
を設計します。- 金額なら
NUMBER(p, 2)
(または通貨によって異なるスケール)。 - 数量なら
NUMBER(p, 0)
またはNUMBER(p)
。 - 割合や比率なら
NUMBER(p, s)
で必要な小数部の桁数を指定。 - 整数のみを扱う場合は
NUMBER(p, 0)
と明示的にスケール0を指定すると、意図が明確になります。 - どのような数値が格納されるか予測できない場合は
NUMBER
を使用しても良いですが、丸めやストレージ利用に注意が必要です。
- 金額なら
- 丸めとトリケーションを理解する:
NUMBER(p, s)
への格納時は四捨五入が行われます。意図的に切り捨てたい場合は、TRUNC
関数を明示的に使用します。 - 異なる数値型との変換に注意:
NUMBER
型とBINARY_DOUBLE
型などの浮動小数点型との間で変換を行う場合、浮動小数点型特有の誤差に留意が必要です。また、文字列型との変換では、TO_NUMBER
関数やTO_CHAR
関数を使用して、形式を指定することが推奨されます。 - NULL値の扱い:
NUMBER
型カラムはNULL値を格納できます。NULL値は数値として扱われません。算術演算に含まれると結果がNULLになることが多いです。 - 範囲チェック: データベース側で厳密な範囲チェックを行いたい場合は、
CHECK
制約を併用することを検討します。NUMBER(p, s)
は格納できる値の形式を制限しますが、ビジネス上の上限下限を保証するものではありません。
9. まとめ
Oracle NUMBER
型は、ビジネスアプリケーションにおいて不可欠な、高精度な10進数演算を可能にするデータ型です。
- 最大桁数は精度
p
によって定義され、最大の有効桁数は38桁です。NUMBER(p, s)
のp
は小数点を含む全体の桁数です。 - 範囲は、内部表現によって決定される約
±10^126
という非常に広い絶対範囲を持ちます。 NUMBER(p, s)
形式で宣言した場合、スケールs
は小数点位置と丸め規則を定め、結果として格納できる数値の実質的な最大値と最小値に影響を与えます。- 格納時には、スケール
s
に基づく丸めが行われ、その結果が精度p
内に収まらない場合はエラーが発生します。 NUMBER
型は可変長であり、格納する値によってストレージサイズが変動します。
NUMBER
型のこれらの特性を正確に理解し、アプリケーションの要件に合わせて適切な精度とスケールを設計することは、データの正確性を保証し、信頼性の高いシステムを構築するために非常に重要です。特に、金融や会計といった分野では、この正確な理解が必須となります。
本記事が、Oracle NUMBER
型の最大桁数と範囲に関する読者の皆様の理解を深める一助となれば幸いです。