PolarDB for Oracle では、整数型、任意精度数値型、浮動小数点型、およびシーケンス型の 4 つのカテゴリの数値型をサポートしています。
| データ型 | ストレージサイズ | 説明 | 範囲 |
|---|---|---|---|
| BINARY INTEGER | 4 バイト | 符号付き整数。INTEGER のエイリアスです。 | -2,147,483,648 ~ 2,147,483,647 |
| DOUBLE PRECISION | 8 バイト | 可変精度(不正確)。 | 15 桁の 10 進精度 |
| INTEGER | 4 バイト | 標準的な整数型です。 | -2,147,483,648 ~ 2,147,483,647 |
| NUMBER | 可変 | ユーザー指定の精度(正確)。 | 最大 1,000 桁の精度 |
| NUMBER(p [, s]) | 可変 | 最大精度 p、オプションのスケール s を持つ正確な数値型です。 | 最大 1,000 桁の精度 |
| PLS INTEGER | 4 バイト | 符号付き整数。INTEGER のエイリアスです。 | -2,147,483,648 ~ 2,147,483,647 |
| REAL | 4 バイト | 可変精度(不正確)。 | 6 桁の 10 進精度 |
| ROWID | 8 バイト | 符号付き 8 バイト整数です。 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| SMALLINT | 2 バイト | 小範囲の整数です。 | -32,768 ~ 32,767 |
| BIGINT | 8 バイト | 大範囲の整数です。 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
| DECIMAL | 可変 | ユーザー指定の精度(正確)。 | 小数点左側最大 131,072 桁、右側最大 16,383 桁 |
| NUMERIC | 可変 | ユーザー指定の精度(正確)。 | 小数点左側最大 131,072 桁、右側最大 16,383 桁 |
| SMALLSERIAL | 2 バイト | 自動インクリメントされる 2 バイト整数です。 | 1 ~ 32,767 |
| SERIAL | 4 バイト | 自動インクリメントされる 4 バイト整数です。 | 1 ~ 2,147,483,647 |
| BIGSERIAL | 8 バイト | 自動インクリメントされる 8 バイト整数です。 | 1 ~ 9,223,372,036,854,775,807 |
整数型
INTEGER は -2,147,483,648 ~ 2,147,483,647 の範囲の整数を格納します。この範囲外の値を挿入するとエラーが発生します。
ディスク領域が極めて限られている場合にのみ SMALLINT を使用してください。INTEGER の範囲を超える値を扱う必要がある場合にのみ BIGINT を使用してください。
ROWID 列には、行の物理アドレスが固定長バイナリデータとして格納されます。表中の記述では ROWID が符号付き 8 バイト整数として示されていますが、実際には 0 ~ 4,294,967,295 の範囲の符号なし 4 バイト整数を格納します。この範囲外の値を挿入するとエラーが発生します。
任意精度数値型
NUMBER は事実上無制限の精度で数値を格納し、正確な計算を実行します。金銭的金額など、精度の損失が許容されない値には NUMBER を使用してください。ただし、NUMBER は次のセクションで説明する浮動小数点型と比較して、著しく処理速度が遅くなります。
精度とスケール — NUMBER の精度とは、小数点の左右両側を含めた有効数字の総桁数を指します。スケールとは、小数点右側の桁数を指します。たとえば、23.5141 は精度が 6、スケールが 4 です。整数のスケールは 0 です。
NUMBER 列は、以下のいずれかの形式で宣言します。
NUMBER(精度, スケール)
NUMBER(精度) -- スケールはデフォルトで 0
NUMBER -- 実装による制限まで、任意の精度およびスケールを受け入れます精度は正の値である必要があります。スケールは 0 以上である必要があります。
スケールが明示的に宣言された NUMBER 列では、入力値がそのスケールに強制的に丸められます。一方、精度およびスケールが指定されていない NUMBER 列では、入力値は丸められません。最大限の移植性を確保するためには、精度およびスケールを明示的に指定することを推奨します。
入力値が宣言された精度またはスケールを超えている場合、PolarDB はその値を四捨五入します。四捨五入しても格納できない場合は、エラーが発生します。
例: NUMBER(3, 1) と宣言された列では、値が小数点第 1 位まで四捨五入され、-99.9 ~ 99.9 の範囲の値を受け入れます。
NUMERIC および DECIMAL は NUMBER と等価です。
浮動小数点型
REAL および DOUBLE PRECISION は、不正確で可変精度の型です。これらは、基盤となるプロセッサ、オペレーティングシステム、およびコンパイラの機能に応じて、IEEE 標準 754 に基づくバイナリ浮動小数点演算(それぞれ単精度および倍精度)を実装します。
不正確とは、一部の値が内部フォーマットに正確に変換できず、近似値として格納されることを意味します。そのため、値の格納および取得時にわずかな差異が生じる可能性があります。浮動小数点型を使用する際は、以下の点に注意してください。
金銭的金額など、正確な格納および計算が必要な場合は、代わりに NUMBER を使用してください。
無限大やアンダーフローなど境界動作が重要な複雑な計算を行う場合は、実装を十分に評価したうえで使用してください。
2 つの浮動小数点値を等価で比較しても、期待通りの結果が得られない場合があります。
ほとんどのプラットフォームでは、REAL の有効値は少なくとも 1E-37 ~ 1E+37、精度は少なくとも 6 桁です。DOUBLE PRECISION の有効値は通常約 1E-307 ~ 1E+308、精度は少なくとも 15 桁です。有効値の範囲を超える値を挿入するとエラーが発生します。有効数字が多すぎる入力値は四捨五入されます。ゼロと区別できないほどゼロに近い値を挿入すると、アンダーフロー・エラーが発生します。
PolarDB では、SQL 標準の表記である FLOAT および FLOAT(p) もサポートしており、p は、2 進数における最小許容精度(ビット数)を指定します。
| FLOAT 表記 | 対応する型 |
|---|---|
FLOAT(1) ~ FLOAT(24) | REAL |
FLOAT(25) ~ FLOAT(53) | DOUBLE PRECISION |
FLOAT(精度未指定) | DOUBLE PRECISION |
p の値がサポート範囲外の場合、エラーが発生します。
シリアル型
SMALLSERIAL、SERIAL、BIGSERIAL は、厳密には数値型ではありません。これらは、他のデータベースにおける AUTO_INCREMENT と同様に、一意の識別子列を作成するための簡便なショートハンドです。
以下の宣言:
CREATE TABLE tablename (
colname SERIAL
);は、以下と等価です。
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;これにより、NOT NULL 制約を持つ整数列が作成され、そのデフォルト値はシーケンスジェネレーターから取得されます。重複値を防止する必要がある場合は、別途 UNIQUE 制約または PRIMARY KEY 制約を追加してください。
行を挿入する際には、SERIAL 列に次のシーケンス値を割り当てるために、列リストから該当列を省略するか、DEFAULT キーワードを使用します。
型の等価関係:
| 短縮形 | 等価な型 | 作成される列の型 |
|---|---|---|
| SERIAL / SERIAL4 | SERIAL | INTEGER |
| BIGSERIAL / SERIAL8 | BIGSERIAL | BIGINT |
| SMALLSERIAL / SERIAL2 | SMALLSERIAL | SMALLINT |
テーブルの寿命中に生成される識別子の数が 2^31 を超える可能性がある場合は、BIGSERIAL を使用してください。
SERIAL 列を削除すると、その基盤となるシーケンスも自動的に削除されます。一方、シーケンスのみを削除した場合、列自体は残りますが、デフォルト値式は失われます。
SERIAL 型は内部的にシーケンスを使用しているため、行が削除されていない場合でも、SERIAL 列の値は連続しないことがあります。シーケンス値は割り当て時に消費されます。挿入トランザクションがロールバックされた場合、その値は再利用されません。