PostgreSQLデータベースは他のデータベースと比較して、多くのデータタイプをサポートしています。数値型、文字列型、日付/時刻型のような一般的なものに加えて、幾何型、ネットワークアドレス型、XML型、JSON型もあります。さらに、
CREATE TYPE
を使ってデータ型を追加することも可能です。本文では、PostgreSQLデータベースの主なデータ型を紹介します。1. 数値型
一般的な数値型は以下の表の通りです:
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
smallint | int2 | 2バイト | -2^15~2^15-1 | 符号付き2バイト整数 | MySQLのsmallint、Oracleのnumber(5) |
integer | int, int4 | 4バイト | -2^31~2^31-1 | 符号付き4バイト整数 | MySQLのint、Oracleのnumber(38,0) |
bigint | int8 | 8バイト | -2^63~2^63-1 | 符号付き8バイト整数 | MySQLのbigint、Oracleのnumber(38) |
real | float4 | 4バイト | 単精度浮動小数点数 | MySQLのfloat、Oracleのbinary_float | |
double precision | float8 | 8バイト | 倍精度浮動小数点数 | MySQLのdouble、Oracleのbinary_doubleまたはnumber | |
numeric [(p, s)] | decimal [(p, s)] | 精度選択可能な精密数値 | MySQLのdecimal[(p, s)]、OracleのNUMBER[(p, s)] | ||
money | 8バイト | -92233720368547758.08~+92233720368547758.07 | 通貨金額 |
2. 自動増分型
一般的な自動増分型は以下の表の通りです:
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
smallserial | serial2 | 2バイト | 2バイト自動増分整数 | MySQLのAUTO_INCREMENT、Oracleのシーケンス | |
serial | serial4 | 4バイト | 4バイト自動増分整数 | MySQLのAUTO_INCREMENT、Oracleのシーケンス | |
bigserial | serial8 | 8バイト | 8バイト自動増分整数 | MySQLのAUTO_INCREMENT、Oracleのシーケンス |
3. ブール型
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
boolean | bool | 1バイト | true/false | MySQLのboolean、Oracleのnumber(1) |
4. 二進数型
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
bytea | 二進数データ | MySQLのblob、Oracleのblob |
5. ビット文字型
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
bit [(n)] | 固定長ビット文字 | MySQLのbit [(n)] | |||
bit varying [(n)] | varbit[(n)] | 可変長ビット文字 |
6. 文字列型
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
character (n) | char (n), bpchar(n) | nバイト | 固定長文字列、不足分はスペースで埋める | MySQLのchar(n) | |
character varying (n) | varchar (n) | 最大nバイト | 可変長文字列 | MySQLのvarchar(n)、Oracleのvarchar(n) | |
bpchar | n文字 | 固定長文字列、不足分はスペースで埋める | |||
text | 可変長文字列 | MySQLのtext、Oracleのclob |
7. 日付/時刻型
名称 | 別名 | ストレージサイズ | 範囲 | 説明 | 他のデータベースとの比較 |
---|---|---|---|---|---|
timestamp [(p)] [without time zone] | 8バイト | 4713BC~294276AD | ノータイムゾーンの日付と時刻 | ||
timestamp [(p)] [with time zone] | 8バイト | 4713BC~294276AD | タイムゾーンありの日付と時刻 | ||
date | 4バイト | 4713BC~5874897AD | 日付 | ||
time [(p)] [without time zone] | 8バイト | 00:00:00~24:00:00 | 時間 | ||
time [(p)] [with time zone] | 12バイト | 00:00:00+1559~24:00:00-1559 | タイムゾーンありの時間 | ||
interval [fields] [(p)] | 16バイト | -178000000years~178000000years | 時間間隔 |
8. 列挙型
列挙型は一連の順序付きの静的値集合を持つデータ型で、使用する前に宣言する必要があります。
CREATE TYPE
で作成します。例えば:sql
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
列挙型を作成したら、PostgreSQLで事前定義された型として使用することができます:
sql
CREATE TABLE person (
name text,
current_mood mood
);
INSERT INTO person VALUES ('Moe', 'happy');
-
幾何型
PostgreSQLには、点、線、矩形、多角形などの幾何型があり、他のデータベースにはない特徴です。
名称 | エイリアス | 保存サイズ | 説明 | 表現形式 |
---|---|---|---|---|
point | – | 16バイト | 平面上の点 | (x,y) |
line | – | 32バイト | 無限直線 | {A,B,C} |
lseg | – | 32バイト | 線分 | ((x1,y1),(x2,y2)) |
box | – | 32バイト | 矩形ボックス | ((x1,y1),(x2,y2)) |
path | – | 16+16nバイト | 閉じたパス(多角形に類似) | ((x1,y1),…) |
path | – | 16+16nバイト | 開いたパス | [(x1,y1),…] |
polygon | – | 40+16nバイト | 多角形(閉じたパスに類似) | ((x1,y1),…) |
circle | – | 24バイト | 円 | <(x,y),r> |
- ネットワークアドレス型
PostgreSQLには、IPv4、IPv6、およびイーサネットMACアドレス用の専用のデータ型が用意されています。
名称 | 保存サイズ | 説明 |
---|---|---|
cidr | 7バイトまたは19バイト | IPv4およびIPv6ネットワークアドレス |
inet | 7バイトまたは19バイト | IPv4およびIPv6ネットワークアドレスとホストアドレス |
macaddr | 6バイト | イーサネットMACアドレス |
macaddr8 | 8バイト | イーサネットMACアドレス(EUI-64) |
- XML型
xmlデータ型は、XMLデータを格納するために使用されます。データを挿入する際に、XMLの規格に準拠していないデータはデータベースに格納されません。また、このデータ型に対する安全性チェック関数が用意されており、xmlparse関数を使ってXMLデータを文字列から変換できます。
XMLPARSE ( {DOCUMENT | CONTENT} value)
XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
以下の方法でも使用できます。
xml '<foo>bar</foo>'
'<foo>bar</foo>'::xml
- JSON型
JSONデータ型は、JSONデータを格納するために使用されます。データを挿入する際に、文字列が適切なJSONデータかどうかが自動的にチェックされます。また、豊富な関数も提供されています。
名称 | 保存サイズ | 説明 |
---|---|---|
json | – | テキストのJSONデータ |
jsonb | – | バイナリ形式で再解析されたJSONデータ |
12.1. JSONとJSONBの違い
- json型は、入力されたデータをそのまま(JSON構文チェックは行われる)データベースに格納します。使用時にはデータを再解析する必要があります。一方、jsonb型は、格納時にJSONデータをバイナリ形式に解析しているため、使用時に再解析は不要で、パフォーマンスが向上します。
- JSONの文字列中で、キー間の余分な空白、キーの順序、重複キーは保持されますが、jsonbではそれらは保持されません。
- jsonbではインデックスを作成できますが、jsonではできません。
12.2. JSONデータ型とPostgreSQLデータ型のマッピング
JSONデータ型の文字列をjsonb型に変換する際、JSONデータ型はPostgreSQLのデータ型に実際には変換されます。マッピングは次の表の通りです。
JSON型 | PostgreSQL型 | 備考 |
---|---|---|
string | text | 文字コードセットに注意 |
number | numeric | JSONにはPostgreSQLの”NaN”と”infinity”値は存在しない |
boolean | boolean | JSONでは小文字の”true”と”false”のみを受け入れる |
null | (なし) | SQLのNULLとは意味が異なる |