このトピックでは、数値型の定義と構文について説明します。
数値型
名前 | ストレージサイズ | 説明 | 値の範囲 |
| 2バイト | 小範囲の整数。 | -32767への32768 |
| 4 バイト | 整数の一般的な選択。 | -2147483647への2147483648 |
| 8 バイト | 広い範囲の整数。 | -9223372036854775807への9223372036854775808 |
| 変数 | ユーザー指定の精度。 このデータ型は正確な型です。 | 小数点の前に最大131,072桁、小数点の後に最大16,383桁。 |
| 変数 | ユーザー指定の精度。 このデータ型は正確な型です。 | 小数点の前に最大131,072桁、小数点の後に最大16,383桁。 |
| 4 バイト | 可変精度。 このデータ型は不正確な型です。 | 精度の10進数6桁 |
| 8 バイト | 可変精度。 このデータ型は不正確な型です。 | 精度の10進数15桁 |
| 2バイト | 自動インクリメントする小さな整数。 | 1から32767 |
| 4 バイト | 自動インクリメントする整数。 | 1から2147483647 |
| 8 バイト | 自動インクリメントする大きな整数。 | 1から9223372036854775807 |
BINARY_INTEGER | 4バイト | 整数のエイリアスである符号付き整数。 | -2147483648から + 2147483647 |
番号 | 変数 | ユーザーが指定した精度。 このデータ型は正確な型です。 | 最大1,000桁の精度。 |
NUMBER(p [, s ] ) | 変数 | 最大精度 (p) とオプションのスケール (s) の正確な値。 | 最大1,000桁の精度。 |
PLS_INTEGER | 4バイト | 整数のエイリアスである符号付き整数。 | -2147483648から + 2147483647 |
ROWID | 8バイト | 符号付き8ビット整数。 | -9223372036854775808 to 9223372036854775807 |
整数型
SMALLINT
、INTEGER
、およびBIGINT
型には、さまざまな範囲の整数が格納されます。 型が許可された値の範囲外の値を格納しようとすると、エラーが発生します。
INTEGER
タイプは、値の範囲、ストレージサイズ、およびパフォーマンスのバランスが最適であるため、一般的に使用されます。 ほとんどの場合、SMALLINT
タイプはディスク容量が不足している場合にのみ使用されます。 BIGINT
型は、INTEGER
型の値の範囲が不十分なシナリオ用に設計されています。
SQLでは、integer
(またはINT
) 、SMALLINT
、およびBIGINT
の整数型のみを指定します。 INT2
、INT4
、およびINT8
型は拡張機能であり、他の多くのSQLデータベースシステムでも使用されています。
任意の精度数値
NUMERIC
タイプには、桁数の多い数字を格納できます。 NUMERICタイプを使用して、正確さを必要とする金額やその他の数量を保存することを推奨します。 NUMERIC
値の加算、減算、および乗算などの計算は、可能な場合に正確な結果を生成する。 ただし、NUMERIC
値の計算は、このトピックの「浮動小数点型」で説明されている整数型または浮動小数点型の値の計算よりも遅くなります。
以下の本文では、精度とスケールの2つの用語を紹介します。 NUMERIC
値の精度は、全体の有効桁数を指定します。これは、小数点の両側の桁数です。 NUMERIC
値のスケールは、小数点の右側の小数部の10進数の桁数を指定します。 項に基づいて、数23.5141は6の精度と4のスケールを持っています。 整数はゼロのスケールを持つと考えることができます。
NUMERIC
列の最大精度と最大スケールを指定できます。 NUMERIC
列を宣言するには、次の構文を使用します。
NUMERIC (精密、スケール)
精度は正の整数でなければならず、スケールは正の整数または0にすることができます。 または、次の構文を使用できます。
NUMERIC (精密)
これは、0のスケールを指定することと等価である。 または、次の構文を使用して、精度やスケールのないNUMERIC列を作成することもできます。
数値
作成された列は、精度の上限内の任意の精度とスケールの数値を格納できます。 このような列は、入力値を特定のスケールの値に変換しません。 対照的に、スケールが指定されているNUMERIC
列は、入力値を指定されたスケールの値に変換します。 SQL標準では、デフォルトのスケール0が必要です。これは、入力値が整数精度の値に変換されることを示します。 これは役に立たない。 ポータビリティが気になる場合は、常にNUMERIC列の精度とスケールを明示的に指定してください。
NUMERIC列に明示的に指定できる最大精度は1,000です。 精度が指定されていないNUMERIC
列は、NUMERIC型の制限の対象となります。
格納する値のスケールが列の指定されたスケールより大きい場合、システムは値を指定された端数桁に丸めます。 小数点の左側の桁数が、指定された精度から指定されたスケールを引いた値を超えると、エラーが報告されます。
数値は、先行ゼロまたは後続ゼロなしで物理的に格納されます。 したがって、列の指定された精度とスケールは、固定された割り当てではなく、両方とも最大です。 この意味で、NUMERIC
型は、CHAR(''N'')
型よりもVARCHAR ('''N'')
型に似ています。 実際の記憶要件は、4桁の10進数の各グループに対して2バイトであり、さらに3〜8バイトのオーバーヘッドである。
通常の数値に加えて、numeric
タイプは特殊なタイプNaN
をサポートします。 NaN
入力値に対する演算は、別のNaN
値を生成する。 SQL文でNaN値を定数として記述する場合は、値を単一引用符 (') で囲む必要があります。 例: UPDATEテーブルSET x = 'NaN'
NaN値を入力すると、NaN
値は大文字と小文字を区別しないものとして認識されます。
NaNのほとんどの実装形態では、NaN
値は、NaN
値を含む任意の他の数値と等しいとは見なされない。 PolarDB for PostgreSQL (Oracleと互換) は、NUMERIC
値を並べ替えてツリーベースのインデックスで使用できるようにするために、NaN
値をすべての非NaN
値よりも大きい等しい値として認識します。
DECIMAL
型とNUMERIC
型は同等です。 どちらの型もSQL標準の一部です。
丸め中に、NUMERIC
型の値はゼロから離れた整数に丸められます。 ほとんどのマシンでは、REAL
タイプとDOUBLE PRECISION
タイプの値は最も近い偶数に丸められます。 次のサンプルコードは、NUMERIC型とDOUBLE PRECISION型の値を丸める方法の例を示しています。
SELECT x、
round(x::numeric) AS num_round,
ラウンド (x::double precision) AS dbl_round
xとしてgenerate_series(-3.5, 3.5, 1) から;
x | num_round | dbl_round
------+-----------+-----------
-3.5 | -4 | -4
-2.5 | -3 | -2
-1.5 | -2 | -2
-0.5 | -1 | -0
0.5 | 1 | 0
1.5 | 2 | 2
2.5 | 3 | 2
3.5 | 4 | 4
(8行)
浮動小数点型
REAL
型とDOUBLE PRECISION
型は、不正確で可変精度の数値型です。 サポートされているすべてのプラットフォームで、REALおよびDOUBLE PRECISIONタイプは、バイナリ浮動小数点算術の電気電子技術者協会 (IEEE) 754標準の実装です。これは、基になるプロセッサ、オペレーティングシステム、およびコンパイラが標準をサポートしています。
不正確とは、一部の値を内部形式に正確に変換できず、近似値として保存することを意味します。 したがって、そのような型の値が格納され、取り出されるときに不一致が生じることがある。 これらのエラーを処理する方法と計算に基づいて伝播する方法は、数学とコンピューターサイエンスの分野全体の主題であり、このトピックでは説明されていません。 このトピックでは、次の項目について説明します。
正確なストレージと金額の計算などの計算が必要な場合は、
NUMERIC
タイプを使用します。重要なビジネスでこれらのタイプを使用して複雑な計算を実装する場合、特に無限大やアンダーフローなどの境界ケースで特定の動作に依存する場合は、実装を慎重に評価する必要があります。
等価のために2つの浮動小数点値を比較すると、期待する結果が常に得られるとは限りません。
サポートされているすべてのプラットフォームで、REAL
タイプは1E-37から1E + 37の範囲をサポートし、10進数6桁以上の精度があります。 DOUBLE PRECISION
タイプは、少なくとも15桁の精度で1E + 308の範囲をサポートします。 大きすぎたり小さすぎたりするとエラーになります。 入力数の精度が高い場合には、入力数を丸めてもよい。 ゼロに近く、ゼロとは異なるものとして表すことができない数字は、アンダーフローエラーを引き起こす。
デフォルトでは、浮動小数点値は、最短の正確な10進表現でテキスト形式で生成されます。 生成された10進値は、同じバイナリ精度で表現可能な他の任意の値よりも、実際の記憶されたバイナリ値に近い。 ただし、出力値が2つの表現可能な値のちょうど中間になることはありません。 これは、入力ルーチンが最も近い偶数へのラウンド規則に適切に従わないという広範なバグを防止する。 この値は、FLOAT8
値に最大17桁の有効10進数を使用し、FLOAT4
値に最大9桁を使用します。
この最短精度の出力形式は、履歴の丸め形式よりも速く出力値を生成します。
以前のバージョンのPolarDB For PostgreSQL (Oracleと互換) で生成された出力値との互換性のため、および出力値の精度を下げるために、extra_float_digitsパラメーターを使用して丸められた10進出力を指定できます。 extra_float_digitsパラメーターを0に設定すると、FLOAT4
値の場合は6桁の有効10桁に、FLOAT8
値の場合は15桁の有効10桁に出力を丸めるという以前のデフォルト設定が復元されます。 extra_float_digitsパラメーターを負の値に設定すると、システムはさらに桁数を減らします。 たとえば、extra_float_digitsパラメーターを-2に設定した場合、システムは出力をFLOAT4値の場合は4桁、FLOAT8値の場合は13桁に丸めます。
extra_float_digitsパラメーターを0より大きい値に設定すると、システムは最短精度の形式を選択します。
より正確な値が必要なアプリケーションでは、extra_float_digitsパラメーターを3に設定できます。 バージョン間の互換性を最大限に高めるために、そのようなアプリケーションのパラメーター設定を維持できます。
通常の数値に加えて、浮動小数点型はいくつかのIEEE 754特殊値をサポートします。
インフィニティ
-インフィニティ
NaN
Infinityは無限大の値を示し、-infinityは負の無限大の値を示し、NaNは非数値を示します。 これらの値をSQL文で定数として記述する場合は、単一引用符 (') で囲む必要があります。 例: UPDATEテーブルSET x = '-Infinity'
これらの値が入力されると、大文字と小文字が区別されないと認識されます。
IEEE 754は、NaN
値がNaN
値を含む他の浮動小数点値と等しくないことを指定しています。 浮動小数点値をソートしてツリーベースのインデックスで使用できるようにするため、PolarDB for PostgreSQL (Oracle互換) は、NaN
値をすべての非NaN
値よりも大きい等しい値として認識します。
PolarDB for PostgreSQL (Oracleと互換) は、不正確な数値型を指定するためのSQL標準表記FLOAT
およびFLOAT(p)
もサポートしています。 p
は、許容可能な最小精度を2進数で指定します。 PolarDB for PostgreSQL (Oracleと互換) は、REAL
タイプが選択されている場合はFLOAT(1)
からFLOAT(24)
を受け入れ、DOUBLE PRECISION
タイプが選択されている場合はFLOAT(25)
からFLOAT(53)
を受け入れます。 許容値の範囲外のp
の値はエラーの原因となります。 精度が指定されていないFLOAT
タイプは、DOUBLE precision
タイプと見なされます。
シリアルタイプ
このセクションでは、PolarDB for PostgreSQL (Oracle互換) 固有の自動インクリメント列の作成方法について説明します。 または、SQL標準のID列機能を使用して、「create TABLE」トピックで説明されている自動インクリメント列を作成することもできます。
SMALLSERIAL
、SERIAL
、およびBIGSERIAL
タイプは実際のタイプではありません。 これらは、他のいくつかのデータベースでサポートされているAUTO_INCREMENT
プロパティと同様に、一意の識別子列を作成するための表記上の便利な記号にすぎません。 現在の実装では、次のステートメントがあります。
テーブルタブ名を作成する (
colnameシリアル
);
は、次の文と同等となります。
シーケンスの作成tablename_colname_seqを整数として作成します。
テーブルタブ名を作成する (
colname整数NOT NULL DEFAULT nextval('tablename_colname_seq ')
);
ALTER SEQUENCE tablename_colname_seqが提供するtablename.colname;
したがって、PolarDB for PostgreSQL (Oracleと互換) は整数列を作成し、そのデフォルト値がシーケンスジェネレータから割り当てられることを指定します。 NOT NULL
制約は、ヌル値を挿入できないようにするために適用される。 ほとんどの場合、重複した値が誤って挿入されないように、UNIQUE
またはPRIMARY KEY
制約をアタッチすることができます。 しかし、これは自動ではない。 最後に、配列は列によって所有されるものとしてマークされる。 このように、列またはテーブルが削除された場合、シーケンスは削除されます。
SMALLSERIAL
、SERIAL
、BIGSERIAL
型はシーケンスを使用して実装されているため、行が削除されていなくても、列に表示される値のシーケンスに穴やギャップが存在する場合があります。 シーケンスから割り当てられた値は、値を含む行がテーブル列に挿入されない場合でも、使用されます。 これは、挿入トランザクションがロールバックした場合に発生します。
シーケンスの次の値をSERIAL
列に挿入するには、SERIAL
列にデフォルト値を割り当てるように指定します。 これは、INSERT
ステートメントの列のリストから列を除外するか、DEFAULT
キーワードを使用して実装できます。
SERIAL
タイプとSERIAL4
タイプは同等です。 どちらもINTEGER
列を作成します。 BIGSERIAL
タイプとSERIAL8
タイプは同等です。 どちらもBIGINT
列を作成します。 テーブルの有効期間に2つ以上の31識別子を使用する場合は、BIGSERIAL
型を使用できます。 SMALLSERIAL
タイプとSERIAL2
タイプは同等です。 どちらもSMALLINT
列を作成します。
SERIAL
列に作成されたシーケンスは、列が削除されると自動的に削除されます。 列を削除せずにシーケンスを削除できますが、これにより列のデフォルト値式が強制的に削除されます。