PostgreSQLデータ型の概要

postgresql データ型 ノウハウ
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');
  1. 幾何型

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>
  1. ネットワークアドレス型

PostgreSQLには、IPv4、IPv6、およびイーサネットMACアドレス用の専用のデータ型が用意されています。

名称 保存サイズ 説明
cidr 7バイトまたは19バイト IPv4およびIPv6ネットワークアドレス
inet 7バイトまたは19バイト IPv4およびIPv6ネットワークアドレスとホストアドレス
macaddr 6バイト イーサネットMACアドレス
macaddr8 8バイト イーサネットMACアドレス(EUI-64)
  1. 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
  1. 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とは意味が異なる
タイトルとURLをコピーしました