数値データ型には2、4、8バイト整数と、4、8バイト浮動小数点および精度設定が可能な数があります。表8.2「数値データ型」に使用可能な型を列挙します。定数で説明しています。数値データ型には対応する算術演算子と関数の一式が揃っています。詳細は9章関数と演算子を参照してください。次節でデータ型について詳しく説明します。整数データ型smallint、integer、bigintは各種範囲の整数、つまり小数点以下の端数がない数を保持します。許容範囲から外れた値を保存しようとするとエラーになります。integer型は数値の範囲、格納サイズおよび性能において最も釣合いが取れていますので、一般的に使用されます。smallint型は通常はディスク容量に制限が付いている場合にのみ使用します。bigint型はintegerの許容範囲では十分ではない場合に使用されるよう設計されています。SQLでは整数の型としてinteger(またはint)とsmallint、bigintのみを規定しています。int2、int4およびint8は拡張ですが、いくつか他のSQLデータベースシステムでも使われています。任意の精度を持つ数numeric型は、非常に大きな桁数で数値を格納できます。通貨金額やその他正確性が求められる数量を保存する時は特に、この型を推奨します。numericの値での計算は、可能なところ、例えば、足し算、引算、掛け算では、正確な結果(訳注:10進の小数で誤差が生じない、ということ)になります。言っても、numericの値に対する計算は整数型、もしくは次節で説明する浮動小数点データ型に比較し非常に遅くなります。この後の説明では、次の用語を使用します。numericの位取りとは、小数点の右側の小数部分の桁数をいいます。numericの精度とは数字全体の有効桁数です。小数点をはさんでいる両側の桁数の合計です。そのため、23.5141という数値の精度は6で位取りは4となります。整数の位取りは、ゼロであるとみなすことができます。numeric列の数値の最大精度と最大位取りの両方を設定することができます。numeric型の列を宣言するには次の構文を使います。scale)精度は正数、位取りは0もしくは正数でなければなりません。他の記述方法として、NUMERIC(precision)は位取りが0であることを選択します。精度も位取りも指定せず、NUMERICと記述すると、実装されている限界の精度まで、いかなる精度あるいは位取りの値も格納できる列が作られます。この類の列は入力値をいかなる特定の位取りにも変換しませんが、宣言された位取りを持つnumeric列は入力値をその位取りに変換します。(標準SQLはデフォルトとして位取り0を要求していて、つまり、整数の精度に変換されます。この方法はあまり役に立たないと思われます。移植性を心配するなら、常に精度と位取りを明示的に設定してください。明示的に型宣言で指定される場合に許される最大精度は1000です。精度の指定がないNUMERICは表8.2「数値データ型」で説明する制限に従います。格納される値の位取りが宣言された列の位取りより大きかった場合、システムは指定された小数部の桁まで値を丸めます。小数点の左側の桁数が、宣言された精度から宣言された位取りを差し引いた数を超える場合にエラーとなります。数値は物理的に先頭や末尾に0を付与されることなく格納されます。したがって、列の宣言された精度と位取りは最大であり、固定的に割り当てられていません。(この意味ではnumericはchar(n)よりもvarchar(n)に似ています。実際の格納に必要な容量は、10進数4桁のそれぞれのグループに対して2バイトと、3から8バイトのオーバヘッドです。通常の数値に加え、numeric型は、「非数値」を意味するNaNという特別な値を取ることができます。NaNに対する操作はすべて、別のNaNを生成します。'NaN'のように、引用符でくくらなければなりません。入力の際は、NaNという文字列は大文字小文字の区別なく認識されます。注記ほとんどの「非数」の概念の実装において、NaNは(NaNを含む)他の数値と等価にならないとみなされています。numeric値をソートできる、また、ツリーを基にしたインデックスで使用できるように、PostgreSQLはNaN同士は等しく、すべてのNaN以外の値よりも大きな値となるものとして扱います。decimalとnumeric型は等価です。2つのデータ型はともに標準SQLに含まれます。precisionは不正確な(訳注:10進の小数で誤差が生じる、ということ)可変精度の数値データ型です。実際にはこれらのデータ型は、使用しているプロセッサ、オペレーティングシステムおよびコンパイラがサポートしていれば、通常は(それぞれ単精度および倍精度の)バイナリ浮動小数点演算用のIEEE規格754の実装です。不正確というのは、ある値はそのままで内部形式に変換されずに近似値として保存されるということです。保存しようとする値と抽出しようとする値の間に多少の差異が認められます。これらのエラーを管理し計算によって補正をどうするかについては、数学とコンピュータ科学の系統すべてに関わることで、以下の点を除き触れません。(金銭金額など)正確な記録と計算が必要な時は代わりにnumericを使用してください。これらのデータ型で何か重要な件に対し複雑な計算を必要とする時、特に(無限大やアンダーフローのような)境界線におけるある種の振舞いについて信頼を置かなければならないのであれば、実装を注意深く検証しなければなりません。2つの浮動小数点値が等価であるのかどうかの比較は予想通りに行かない時もあります。ほとんどのプラットフォームではrealは最低6桁の精度を持ち、少なくとも1E-37から1E+37までの範囲です。precisionは通常最低15桁の精度でおよそ1E-307から1E+308までの範囲です。大き過ぎたり小さ過ぎる値はエラーの原因となります。入力値の精度が高過ぎる場合は丸められることがあります。含む値が出力用のテキストに変換される場合、extra_float_digitsによって有効数字を制御します。デフォルト値の0が指定されている場合、出力はPostgreSQLをサポートする全てのプラットホームで同じです。この値を大きくすることで格納された値をより精密に表現できますが、プラットホーム間の移植性が失われるかもしれません。通常の数値に加え、浮動小数点型では以下の特殊な値を取ります。754に従わないマシンでは、これらの値はおそらく正しく動作しません。'Infinity'のように引用符でくくる必要があります。入力の際、これらの文字列は大文字小文字の区別なく認識されます。注記IEEE754では、NaNは(NaNを含む)他のすべての浮動小数点値と比べた時に不等でなければならないと規定しています。浮動小数点値をソートできる、また、ツリーを基にしたインデックスで使用できるように、PostgreSQLはNaN同士は等しく、すべてのNaN以外の値よりも大きな値となるものとして扱います。PostgreSQLでは不正確な数値型についての標準SQLの表記であるfloatとfloat(p)をサポートしています。ここで、pは2進数桁数で最低限、許容可能な精度を指定します。precisionを選択するものとして受け付けます。許容範囲外のpの値はエラーになります。precisionとして解釈されます。precisionの仮数がそれぞれ24ビットと53ビットであるという前提は、IEEE標準浮動小数点の実装では正しいものです。非IEEEのプラットフォームでは、若干、異なる可能性がありますが、単純化のためにすべてのプラットフォームでpの範囲は同一です。(他のデータベースでサポートされるAUTO_INCREMENTプロパティに似ています)。SERIAL);は以下を指定することと同じです。tablename.colname;このように整数列を作成し、その列のデフォルト値が連番ジェネレータから割り当てられるようにしました。NULL制約を適用することによって、NULL値が挿入されないようにします。KEY制約も追加することになるでしょうが、これは自動的には行われません。最後に、シーケンスは列に「より所有」されるものと印が付きます。したがって、テーブルの列が削除された場合にシーケンスは削除されます。serialおよびbigserialはシーケンスを使って実装されているため、行の削除が行われていなくとも、列に"穴"や連番の抜けが発生するかもしれません。テーブルへ正常に挿入されていないにも関わらず、シーケンスの値を"消費してしまう"こともあります。これは、例えば挿入したトランザクションがロールバックされた時に発生することがあります。シーケンス操作関数のnextval()を参照してください。serial列にシーケンスの次の値を挿入するには、serial列にそのデフォルト値を割り当てるよう指定してください。これは、INSERT文の列リストからその列を除外する、もしくはDEFAULTキーワードを使用することで行うことができます。serialとserial4という型の名称は等価です。ともにinteger列を作成します。bigserialとserial8という型の名称もbigint列を作成することを除いて同じ振舞いをします。テーブルを使用する期間で231以上の識別子を使用すると予測される場合、bigserialを使用すべきです。smallserialとserial2という型の名称もまた、smallint列を作成することを除いて同じ振舞いをします。serial列用に作成されたシーケンスは、それを所有する列が削除された時に自動的に削除されます。列を削除せずにシーケンスを削除することができますが、これにより強制的に列のデフォルト式が削除されます。