すべてのプロダクト
Search
ドキュメントセンター

PolarDB:数値型

最終更新日:May 31, 2024

このトピックでは、数値型の定義と構文について説明します。

数値型

名前

ストレージサイズ

説明

値の範囲

SMALLINT

2バイト

小範囲の整数。

-32767への32768

INTEGER

4 バイト

整数の一般的な選択。

-2147483647への2147483648

ビギント

8 バイト

広い範囲の整数。

-9223372036854775807への9223372036854775808

デシマル

変数

ユーザー指定の精度。 このデータ型は正確な型です。

小数点の前に最大131,072桁、小数点の後に最大16,383桁。

数値

変数

ユーザー指定の精度。 このデータ型は正確な型です。

小数点の前に最大131,072桁、小数点の後に最大16,383桁。

リアル

4 バイト

可変精度。 このデータ型は不正確な型です。

精度の10進数6桁

二重精度

8 バイト

可変精度。 このデータ型は不正確な型です。

精度の10進数15桁

SMALLSERIAL

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

整数型

SMALLINTINTEGER、およびBIGINT型には、さまざまな範囲の整数が格納されます。 型が許可された値の範囲外の値を格納しようとすると、エラーが発生します。

INTEGERタイプは、値の範囲、ストレージサイズ、およびパフォーマンスのバランスが最適であるため、一般的に使用されます。 ほとんどの場合、SMALLINTタイプはディスク容量が不足している場合にのみ使用されます。 BIGINT型は、INTEGER型の値の範囲が不十分なシナリオ用に設計されています。

SQLでは、integer (またはINT) 、SMALLINT、およびBIGINTの整数型のみを指定します。 INT2INT4、および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」トピックで説明されている自動インクリメント列を作成することもできます。

SMALLSERIALSERIAL、および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制約をアタッチすることができます。 しかし、これは自動ではない。 最後に、配列は列によって所有されるものとしてマークされる。 このように、列またはテーブルが削除された場合、シーケンスは削除されます。

重要

SMALLSERIALSERIALBIGSERIAL型はシーケンスを使用して実装されているため、行が削除されていなくても、列に表示される値のシーケンスに穴やギャップが存在する場合があります。 シーケンスから割り当てられた値は、値を含む行がテーブル列に挿入されない場合でも、使用されます。 これは、挿入トランザクションがロールバックした場合に発生します。

シーケンスの次の値をSERIAL列に挿入するには、SERIAL列にデフォルト値を割り当てるように指定します。 これは、INSERTステートメントの列のリストから列を除外するか、DEFAULTキーワードを使用して実装できます。

SERIALタイプとSERIAL4タイプは同等です。 どちらもINTEGER列を作成します。 BIGSERIALタイプとSERIAL8タイプは同等です。 どちらもBIGINT列を作成します。 テーブルの有効期間に2つ以上の31識別子を使用する場合は、BIGSERIAL型を使用できます。 SMALLSERIALタイプとSERIAL2タイプは同等です。 どちらもSMALLINT列を作成します。

SERIAL列に作成されたシーケンスは、列が削除されると自動的に削除されます。 列を削除せずにシーケンスを削除できますが、これにより列のデフォルト値式が強制的に削除されます。