はじめに
本記事では、PostgreSQLで使用できる主要な型の一覧を
備忘録としてまとめます。
SQLiteと比べて型が厳密に管理される点が大きな違いです。
1. PostgreSQLの型システムの特徴
PostgreSQLは型が厳密に管理されます。
-- TEXT型の列にINTEGERを入れるとエラー
CREATE TABLE test (name TEXT);
INSERT INTO test VALUES (42); -- エラー:integer is not text
SQLiteと異なり、宣言した型以外の値は原則として格納できません。
2. 数値型
| 型名 | サイズ | 範囲 | 用途 |
|---|---|---|---|
SMALLINT |
2バイト | -32,768〜32,767 | 小さな整数 |
INTEGER / INT
|
4バイト | 約±21億 | 一般的な整数 |
BIGINT |
8バイト | 約±922京 | 大きな整数 |
SERIAL |
4バイト | 1〜約21億 | 自動採番(主キーに使う) |
BIGSERIAL |
8バイト | 1〜約922京 | 大きな自動採番 |
DECIMAL(p,s) / NUMERIC(p,s)
|
可変 | 精度指定可能 | 金額・正確な小数 |
REAL |
4バイト | 6桁精度 | 浮動小数点 |
DOUBLE PRECISION |
8バイト | 15桁精度 | 高精度浮動小数点 |
金額計算にはNUMERICまたはDECIMALを使ってください。
REALやDOUBLE PRECISIONは浮動小数点誤差が出る場合があります。
3. 文字列型
| 型名 | 内容 | 用途 |
|---|---|---|
CHAR(n) |
固定長文字列(n文字・不足はスペース埋め) | 固定長コード |
VARCHAR(n) |
可変長文字列(最大n文字) | 名前・タイトル |
TEXT |
可変長文字列(長さ制限なし) | 説明文・本文 |
PostgreSQLではTEXTとVARCHARのパフォーマンス差はほぼありません。
制限が不要な場合はTEXTを使うのがシンプルでおすすめです。
4. 真偽値型
| 型名 | 値 | 内容 |
|---|---|---|
BOOLEAN |
TRUE / FALSE / NULL
|
真偽値 |
-- 以下はすべてTRUEとして扱われる
INSERT INTO flags VALUES (TRUE);
INSERT INTO flags VALUES ('true');
INSERT INTO flags VALUES ('yes');
INSERT INTO flags VALUES (1);
SQLiteと異なり専用のBOOLEAN型が存在します。
5. 日付・時刻型
| 型名 | 内容 | 例 |
|---|---|---|
DATE |
日付のみ | '2026-04-11' |
TIME |
時刻のみ | '09:00:00' |
TIMESTAMP |
日付と時刻 | '2026-04-11 09:00:00' |
TIMESTAMPTZ |
タイムゾーン付き日時 | '2026-04-11 09:00:00+09' |
INTERVAL |
時間の間隔 |
'1 day' / '2 hours'
|
本番環境ではTIMESTAMPTZの使用を推奨します。
タイムゾーンを意識した設計にしておくと
国際化対応やサマータイム問題を防げます。
6. バイナリ型
| 型名 | 内容 |
|---|---|
BYTEA |
バイナリデータ |
7. PostgreSQL独自の型
SQLiteにはない型です。
| 型名 | 内容 | 用途 |
|---|---|---|
UUID |
128ビットの一意識別子 | 分散システムのID管理 |
JSON |
JSONデータ(テキスト形式) | JSONの保存 |
JSONB |
JSONデータ(バイナリ形式) | JSONの高速検索 |
ARRAY |
配列型 | 複数値を1列に保存 |
INET |
IPアドレス | ネットワーク管理 |
SERIAL |
自動採番整数 | 主キー |
JSONとJSONBの違い:
JSONはテキストそのままで保存・JSONBはバイナリに変換して保存します。
検索・インデックスが必要ならJSONBを選んでください。
8. SQLiteとPostgreSQLの型比較
| 用途 | SQLite | PostgreSQL |
|---|---|---|
| 整数 | INTEGER |
INTEGER / BIGINT
|
| 自動採番 | INTEGER PRIMARY KEY |
SERIAL / BIGSERIAL
|
| 文字列 | TEXT |
TEXT / VARCHAR(n)
|
| 真偽値 |
INTEGER(0/1) |
BOOLEAN |
| 日付 |
TEXT(文字列で代用) |
DATE |
| 日時 |
TEXT(文字列で代用) |
TIMESTAMP / TIMESTAMPTZ
|
| JSON | なし |
JSON / JSONB
|
| 型の厳密さ | 緩い(何でも入る) | 厳密(型違いはエラー) |
まとめ
| ポイント | 内容 |
|---|---|
| 型は厳密 | 宣言した型以外は入らない |
| 自動採番 |
SERIALを使う |
| 真偽値 |
BOOLEAN型が使える |
| 日時 |
TIMESTAMP / TIMESTAMPTZが使える |
| JSON |
JSONBが検索に強くおすすめ |