Postgres で使用可能なデータ型に ついて説明します。
Postgres は、多くのネイティブな データ型を提供してしています。 また、別で解説している DEFINE TYPE コマンドを使えば、Postgres に新しい型 を追加することもできます。
データ型の内容について、以下のセクションでSQL標準への準拠や 移植状況、および使用法について解説しています。 いくつかの Postgres データ型は直接 SQL92 互換のデータ型に対応しています。その他の 場合、SQL92 文法で定義されているデータ型は、 直接ネイティブな Postgres のデータ型 にマッピングされています。 組み込み済みのデータ型の多くは明示的な外部フォーマットを 持っています。しかし、"開いたパス"あるいは"閉じたパス"を保存する path 型のように Postgres 固有のものも あれば、data 型や time 型のように、複数のフォーマットを持つものも あります。
Table 3-1. Postgres のデータ型
Postgres のデータ型 | SQL92 又は SQL3 のデータ型 | 説明 |
---|---|---|
bool | boolean | 論理ブール型(真/偽) |
box | 2次平面における矩形 | |
char(n) | character(n) | 固定長文字列 |
cidr | インターネットプロトコル バージョン4 の ネットワークアドレスまたはホストアドレス | |
circle | 2次平面における円形 | |
date | date | 時刻を含まない日付 |
float4/8 | float(p) | 精度pを持つ浮動小数点数 |
float8 | real, double precision | 倍精度浮動小数点数 |
inet | インターネットプロトコル バージョン4 における ネットワークアドレスまたはホストアドレス | |
int2 | smallint | 符号付き2バイト整数 |
int4 | int, integer | 符号付き4バイト整数 |
int4 | decimal(p,s) | p <= 9, s = 0 な正確な数値 |
int4 | numeric(p,s) | p == 9, s = 0 な正確な数値 |
int8 | 符号付き8バイト整数 | |
line | 2次平面における直線 | |
lseg | 2次平面における線分 | |
money | decimal(9,2) | 米国通貨 |
path | 2次平面における開いた、および閉じた座標パス | |
point | 2次平面における座標点 | |
polygon | 2次平面における閉じた座標パス(多角形) | |
serial | インデックスや相互参照に使用される重複しない番号 | |
time | time | 時刻 |
timespan | interval | 汎用的な時間の間隔 |
timestamp | timestamp with time zone | 日付/時間 |
varchar(n) | character varying(n) | 可変長文字列 |
Note: cidr 型と inet 型は、すべての インターネットプロトコルの種類を扱えるように設計されて いましたが、現在の実装では、インターネットプロトコル バージョン4しか扱うことが出来ません。 ここで説明するバージョン4の内容は、将来のバージョンで サポートされるはずのバージョン6にも当てはまるはずです。
Table 3-2. Postgres 関数定数
Postgres 関数 | SQL92 定数 | 説明 |
---|---|---|
getpgusername() | current_user | 現在のセッションにおけるユーザ名 |
date('now') | current_date | 現在のトランザクションにおける日付 |
time('now') | current_time | 現在のトランザクションにおける時刻 |
timestamp('now') | current_timestamp | 現在のトランザクションにおける日付と時刻 |
Postgres は、ORDBMS 開発の最先端 の機能を持っています。SQL3 対応に加え、 SQL92 の相当の部分がサポートされています。 SQL92 の準拠に最大限の努力をしてはいます が、標準案の中にはまずい考え方や未来の標準としては生き残れ ないような物もあります。 Postgres では、それらについて 積極的に対応する考えはありません。しかしながら、これら はあまり使用されないで廃れてゆく傾向にあり、通常のユーザは それらをまず使うことはないようです。
ベースとなる型(整数や浮動小数点数など)に対応しているほとんど の入出力関数は、いくつかのエラーチェックをしますが、特別に 厳密なチェックを行わないものもあります。より重要なのは、 演算子や関数 (たとえば加算や乗算) によっては、全くエラー チェックを行わないものがあることです。このため、多くの数値 演算子が(たとえば)アンダーフローやオーバーフローを起こしたと しても、それをユーザに通知することはありません。
入出力関数の中には可逆的でないものもあります。つまり、ある 出力関数の結果をオリジナルの入力と比較した場合、有効桁数を 失うことがありうるということです。
Note: Berkeley 校から受け取った Postgres v4.2 のオリジナル コードでは、全ての倍精度浮動小数点数を全て6桁に四捨五入 していました。 v6.1から、浮動小数点数はそのデータ型の最も本質的な精度 (一般には double 型では15桁、float 型では6桁)を保持する ことが出来るようになりました。 geometric 型のような存在的に浮動小数点をもつ他のデータ型 でも、似たような精度を伴っています。
数値型には、2バイトと4バイトの整数と、4バイトと8バイトの 浮動小数点数が在ります。
Table 3-3. Postgres の数値型
数値型 | 記憶領域 | 説明 | 有効範囲 |
---|---|---|---|
float4 | 4 bytes | 可変精度 | 小数位6桁 |
float8 | 8 bytes | 可変精度 | 小数位15桁 |
int2 | 2 bytes | 固定精度 | -32768 から +32767 |
int4 | 4 bytes | 固定精度。通常これを選択 | -2147483648 から +2147483647 |
int8 | 8 bytes | 固定精度。非常に大きな有効範囲を持つ | +/- > 18 桁の整数 |
serial | 4 bytes | インデックスや相互参照に使用する | 0 から +2147483647 |
数値型は対応する算術演算子と関数をフルセットで持っています。 詳細は 算術演算子 と 算術関数 を参照して ください。
serial 型は、Postgres が既に在るコンポーネントの組み合わせで作る特別なデータ型で、 一般的にはテーブルの項目に一意な識別子(id)を作るため使われます。 現在の実装では serial 型を使用する時に、
CREATE TABLE tablename (colname SERIAL);と指定するのは、以下と同等です:
CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename (colname INT4 DEFAULT nextval('tablename_colname_seq'); CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);
Caution |
serial 型を含んでいるテーブルが削除されても、 serial 型のために作られた暗示的なシーケンスは、 自動的に削除されません。 そのため、次のようなコマンド操作は多分失敗します: CREATE TABLE tablename (colname SERIAL); DROP TABLE tablename; CREATE TABLE tablename (colname SERIAL);シーケンスは DROP SEQUENCE コマンドを使って 明示的に削除しない限りデータベース内に残っています。 |
int8 型は、コンパイラに依存することから 全てのプラットフォーム上で使用可能と言う訳では有りません。