Skip to content

PostgreSQLのデータ型 解説

よく使われるPostgreSQLのカラムデータ型をすべて、ファミリー別にグループ化して紹介します: 整数、10進数・小数、テキスト、時間、真偽値とUUID、JSON、ネットワークアドレス、複合型、拡張型。各行はその型が何を格納し、いつ選ぶべきかを示します。

PostgreSQLには数十の型がありますが、日常的なスキーマ設計で使うのは中心的なセットです。繰り返し現れる選択は、数値ならinteger対numeric、文字列ならvarchar対text(textでたいてい十分)、時刻ならtimestamp対timestamptz(実世界のあらゆる瞬間にはtimestamptzを推奨)、そしてjson対jsonb(jsonbを推奨。バイナリ形式でインデックス可能)です。収まる範囲で最も具体的な型を選びましょう。データベースが自動的に強制してくれます。

リファレンステーブル · 46 項目
46 of 46 rows
整数
-32768〜32767の2バイト整数。まれ。容量を節約する必要がある場合のみ。
4バイト整数。およそ±20億。デフォルトの整数カラム。
8バイト整数。およそ±900京。非常に大きいカウンタや外部ID。
自動採番の4バイト整数。旧来の自動連番キー。PG 10以降はGENERATED AS IDENTITYが推奨の後継。
serialの2バイト版と8バイト版。smallintまたはbigintカラムに合わせた自動採番。
テーブルが自動生成する整数(GENERATED ALWAYS AS IDENTITY)。モダンなserial。SQL標準で、手動INSERTに対してもより安全。
10進数と浮動小数点
任意精度の正確な10進数。金額や、丸め誤差が許されないあらゆる用途。
4バイトの単精度浮動小数点数。精度が決定的でない近似的な科学値。
8バイトの倍精度浮動小数点数。地理空間、統計、MLの特徴量。
固定ロケールの通貨額。まれ。通貨コードをアプリ側で扱うnumericの方が移植性が高い。
テキスト
固定長テキスト。スペースで埋められる。幅が決まったコード。ほとんど不要。
任意の上限つき可変長テキスト。ユーザー名やメールアドレスのような上限あり文字列。
長さ制限のない可変長テキスト。汎用の文字列カラム。varcharに対して性能ペナルティはない。
時間
時刻を含まないカレンダー上の日付。誕生日や期日。
時刻。タイムゾーン付きまたはなし。毎日のアラームや営業時間。
タイムゾーンなしの日付と時刻。レガシースキーマ。新しい開発では避ける。
UTCで保存され、クライアントのタイムゾーンで表示される日付と時刻。実世界のあらゆる瞬間のデフォルト。timestampよりこちらを推奨。
2日や3時間のような時間の長さ。期間や日付計算。
真偽値・UUID・バイト
真または偽。フラグやトグル。
128ビットの汎用一意識別子。公開しても安全な非連番ID(アプリ側またはgen_random_uuidで生成)。
生のバイナリバイト列。Blob、画像、不透明なペイロード。大きなファイルはオブジェクトストレージへ。
固定長または可変長のビット列。パックされたフラグやプロトコルフィールド。単一のオン/オフ値なら依然としてboolean。
JSONと半構造化データ
バイナリ形式に解析され、インデックス可能になったJSON。柔軟またはネストされたデータ。推奨されるJSONカラム(GINインデックスをサポート)。
元のテキストのまま保持されるJSON。まれ。キー順序や正確な空白を保持する必要がある場合のみ。
XMLテキスト。XMLが必須のレガシー連携。
JSONデータ内を移動するためのコンパイル済みパス式。jsonb_path_queryやSQL/JSON演算子でjsonb内をフィルタリング。
ネットワークと検索
IPv4またはIPv6のホストアドレス。クライアントやサーバーのIPを保存。
10.0.0.0/24のようなIPネットワークブロック。ファイアウォールルールやサブネット範囲。
6バイトまたは8バイト(EUI-64)のMACアドレス。デバイスやネットワークインターフェースの識別子。
全文検索用に前処理されたテキスト。専用検索エンジンに頼る前の、PostgreSQL組み込み検索。
AND、OR、前置演算子で組み合わせた検索語。全文検索のクエリ側。@@でtsvectorと照合する。
先行書き込みログ(WAL)の位置、ログシーケンス番号。レプリケーション遅延やバックアップの監視。
複合型と高度な型
任意の基本型の配列。例: integer[]。単純な値のリスト。要素が独自のカラムを必要とするなら子テーブルを使う。
自分で定義した固定リストから1つの値。選択肢が安定しているステータスフィールド。
複数フィールドからなるカスタム行型。テーブル間で共有される繰り返しフィールド群。
2つの境界の間の連続範囲。重なり演算子とともに、スケジュール、価格帯、バージョン区間に。
自分で定義した制約で包んだ基本型。空でないメールのような再利用可能なルール。使うすべてのカラムで強制される。
型付き値からなる無名の行。PL/pgSQL関数の戻り値やクエリの中間結果。
組み込みの2次元幾何値。単純な平面幾何。実世界の位置にはPostGISが必要。
符号なし4バイトのシステムオブジェクト識別子。システムカタログの結合用。アプリケーションのカラムには使わない。
63文字の内部識別子文字列。カタログ照会用。ユーザーに見せるデータには通常のtextを。
拡張型
1つの値に格納されたキー/値の文字列ペア(拡張)。フラットなマップ。今日ではjsonbの方が優れている。
news.tech.aiのような階層ラベルパス(拡張)。祖先・子孫クエリを伴うツリー構造。
大文字小文字を区別せず比較するテキスト(拡張)。lower()インデックスなしで、メールのような大文字小文字を無視した一意性。
PostGIS拡張が提供する地理・幾何オブジェクト。距離、包含、空間インデックスのクエリ。
UUID値を生成する拡張関数群。レガシーな生成方法。PG 13以降はgen_random_uuid()が組み込み。