PostgreSQL 型チートシート
数値型
型 | サイズ | 範囲 / 精度 | 主な用途 | 例 |
---|---|---|---|---|
smallint |
2 byte | -32,768 ~ 32,767 | 小さな整数 | score SMALLINT |
integer (int4 ) |
4 byte | -2,147,483,648 ~ 2,147,483,647 | 汎用整数(最も利用) | age INTEGER |
bigint (int8 ) |
8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 非常に大きい整数 | visits BIGINT |
serial / bigserial
|
4 / 8 byte | 1 から上限値まで連番(integer / bigint と同じ範囲) |
自動連番(PK向け) | id SERIAL PRIMARY KEY |
real (float4 ) |
4 byte | 約 ±3.4 × 10³⁸(有効桁 ~6 桁) | 浮動小数(丸め誤差あり) | temperature REAL |
double precision (float8 ) |
8 byte | 約 ±1.7 × 10³⁰⁸(有効桁 ~15 桁) | 高精度浮動小数 | distance DOUBLE PRECISION |
numeric(p,s) / decimal(p,s)
|
可変 |
p = 精度(全桁数) s = スケール(小数点以下桁数) 例 NUMERIC(10,2) → 最大 10 桁のうち小数 2 桁 |
正確な数値計算(会計など) | price NUMERIC(10,2) |
備考
serial
/bigserial
は実体がinteger
/bigint
+シーケンス。通常は正の連番。- 浮動小数 (
real
/double precision
) は速いが誤差が出るため、金額など誤差 NG のケースではnumeric
を推奨。numeric
はp
とs
を省略すると “ほぼ無制限” だが、ストレージと計算コストが増えるので必要最小限の指定がおすすめ。
文字列型
型 | サイズ | 特徴 / 制約 | 例 |
---|---|---|---|
char(n) |
n byte + 1–4 byte オーバヘッド | 固定長・不足分は空白で右詰め補完。n は 1 ~ 10⁷ まで指定可(実質 1 GB)。検索キーなど “常に桁数が決まっている” コード向け。 |
code CHAR(3) |
varchar(n) |
最大 n byte + 1–4 byte | 可変長・上限 n 文字。n > 10⁷ は指定不可。空き領域を節約しつつ入力長を制限したいときに。 |
username VARCHAR(50) |
varchar (制限なし) |
実質 1 GB まで | 内部的には text と同じ型。長文 OK だが “制限なし” を宣言する点に注意(バリデーションはアプリ側になる)。 |
note VARCHAR |
text |
実質 1 GB まで | 完全フリーサイズ。ブログ本文や JSON ストリング等、とにかく長い文字列を入れたいときの定番。 | description TEXT |
PostgreSQL の文字長は バイト数 ではなく 文字数(UTF-8 コードポイント) で計算される点に注意。
1~4 byte のオーバヘッドは内部 TOAST 圧縮や長さタグに使われる。
オーバーヘッドはPostgreSQL が文字列を保存する際に使う追加バイト。
日付・時刻型
型 | サイズ | 格納範囲 | 主な用途 | 例 |
---|---|---|---|---|
date |
4 byte | 4713 BC-01-01 ~ 5874897-12-31 | 年月日だけ。誕生日や請求日等 “日付だけ” に最適。 | birthday DATE |
time |
8 byte | 00:00:00 ~ 23:59:59.999999 | 時刻のみ。タイムゾーン無し。 | meeting_time TIME |
timestamp |
8 byte | 4713 BC-11-24 00:00:00 ~ 294276-12-31 23:59:59.999999 | 日付+時刻(ローカルタイム)。 | updated_at TIMESTAMP |
timestamptz |
8 byte | 同上(内部は UTC へ自動変換) | タイムゾーン付き。常に世界共通時刻で保存し、アプリ側でローカル表記。 | created_at TIMESTAMPTZ |
timestamptz
で “tz” は 保存値にタイムゾーンを含む というより “保存時に UTC 変換する” 意味。
夏時間切替などのバグを避けるためにもtimestamptz
一択 が実務の鉄板。
4713 BC =紀元前4713年
UTCは「世界中で共通の時間基準」。UTC + 9時間が日本。
論理型
型 | サイズ | 値 | 例 |
---|---|---|---|
boolean |
1 byte |
TRUE / FALSE / NULL
|
is_active BOOLEAN |
FALSE
を0
などで代用する必要はなし。インデックスも張れる。
配列型
型例 | サイズ | 特徴 / 注意 | 使用例 |
---|---|---|---|
int[] |
エントリ合計 + 24 byte〜 | 整数の配列。多次元も可(最大 6 次元 × 約 10⁹ 要素)。要素の追加・削除はクエリが複雑になりやすい。 |
scores INT[] '{100, 92, 88}'
|
text[] |
同上 | 文字列の配列。タグ・キーワードなど可変件数の文字列に便利。 |
設計TIP:更新頻度が高い場合は正規化(別テーブル化)を検討。