4.1 データ型と型変換

PostgreSQLは多くのデータ型をサポートしています。この章では、使用頻度が高い数値データ型、文字列データ型、日付・時刻データ型と、データ型の変換について説明します。

数値データ型

数値データ型は、いわゆる「数」を保管するためのデータ型です。データベースでは四則演算をはじめ、様々な数値演算のための関数などが用意されているので、簡単に数値データを加工して取り扱うことができます。

integer型

整数のデータ型です。-2147483648から+2147483647までの整数値を格納することができます。以下のように指定します。

integer

整数値のため、小数点以下の値は格納されません。小数点以下の値が入力された場合は最も近い整数に丸められます。

numeric型

任意の精度の数値データ型です。小数点以下の値を含む数値を格納することができます。小数点より上の整数部は131072桁まで、小数点より下の小数部は16383桁までの桁数を指定できます。以下は指定方法です。

numeric [(精度 [, 位取り])]
  • 精度は、整数部と小数部を合わせた桁数です。省略時は無制限となります。
  • 位取りは、小数部の桁数です。精度のみを指定した場合の位取りは 0 となります。

たとえば「numeric(6,2)」と指定すると、全体の桁数は6桁、小数点以下は2桁、整数部は6-2で4桁なので最大9999.99までの値を格納することができます。

その他の数値データ型

PostgreSQLはinteger型、numeric型以外の数値型も備えています。これらはデータの性質に合わせたデータベースへの保管や、互換性の維持などの目的のために用意されています。

数値データ型をまとめると以下のようになります。

データ型 サイズ 説明 範囲
smallint 2バイト 小さい整数 -32768から+32767
int, integer 4バイト 整数 -2147483648から+2147483647
bigint 8バイト 大きい整数 -9223372036854775808から+9223372036854775807
decimal, numeric 可変長 固定小数点数 小数点より上は131072桁まで、小数点より下は16383桁まで
real 4バイト 単精度浮動小数点数 6桁精度
double precision 8バイト 倍精度浮動小数点数 15桁精度
smallserial 2バイト 小さい正の整数 1から32767
serial 4バイト 正の整数 1から2147483647
bigserial 8バイト 大きい正の整数 1から9223372036854775807

 

文字列データ型

文字列データ型は、文字のデータを保管することができます。文字数の上限や、可変長か固定長かなどによって異なるデータ型があります。

character varying型(varchar型)

文字数に上限のある可変長の文字列型です。可変長ですから、文字数制限内であれば何文字の文字データでも構いません。以下のように指定します。

varchar[(長さ)]
  • 長さは、格納可能な文字数の上限です。省略時は無制限となります。

たとえば「varchar(3)」と指定すると、文字数の長さは半角、全角にかかわらず長さ3(3文字)までを許容します。

character型(char型)

文字数に上限のある固定長の文字列型です。固定長のため、足りない分の文字数は空白で埋められます。以下のように指定します。

char[(長さ)]
  • 長さは、固定の文字数です。省略時は 1 となります。

たとえば「char(3)」と指定すると、3文字未満の文字列は3文字になるように末尾まで空白で埋められます。

text型

文字数に上限のない可変長の文字列型です。以下のように指定します。

text

text型は、SQL標準には定義されていないデータ型です。

文字列データ型をまとめると以下のようになります。

データ型 サイズ 説明
char, chracter 固定長 空白で埋められた文字列
varchar, chracter varying 可変長 長さ上限付き文字列
text 可変長 長さ制約なし文字列

 

日付・時刻データ型

日付・時刻データ型は、日付だけを格納するデータ型、時刻だけを格納するデータ型、両方を同時に格納するデータ型の3つが使用できます。目的に応じて使い分けるとよいでしょう。

date型

日付のみを格納する日付・時刻データ型です。以下のように指定します。

date

時刻データは切り捨てられて、00:00:00となります。

time型

時刻のみを格納する日付・時刻データ型です。以下のように指定します。

time [(精度)]
  • 精度は、秒フィールドの小数点以下の桁数です。省略時は 6 (マイクロ秒単位)です。
timestamp型

日付と時刻の両方を格納する日付・時刻データ型です。以下のように指定します。

timestamp [(精度)]
  • 精度は、time型と同じです。
その他の日付・時刻型

time型とtimestamp型には、時間帯付きのものがあります。また、時間間隔を表すinterval型もあります。

日付・時刻データ型をまとめると以下のようになります。

データ型 サイズ 説明 範囲
date 4バイト 日付(時刻なし) 4713 BC から 5874897 AD
time 8バイト 時刻(日付なし) 00:00:00 から 24:00:00
time with time zone 12バイト 時刻(日付なし、時間帯付き) 00:00:00+1559 から 24:00:00-1559
timestamp 8バイト 日付と時刻両方 4713 BC から 294276 AD
timestamp with time zone 8バイト 日付と時刻両方(時間帯付き) 4713 BC から 294276 AD
interval 16バイト 時間間隔 -178000000年から178000000年

 

データ型の変換

データ型の変換は、表への格納時や、演算子や関数の実行に際して暗黙に行われる変換とユーザの明示的な指定による変換があります。

暗黙の変換

データを表に格納する場合、定義されている列のデータ型に可能な限り自動的に変換されます。また、演算子や関数を実行する場合、その演算子や関数で扱うデータ型に可能な限り自動的に変換されます。

具体例として、integer型からnumeric型に暗黙に変換されるSELECT文を以下に示します。

SELECT 10.5 / 3;

integer型の除数 3 がnumeric型に変換されて除算が実行され、小数部を持つnumeric型の結果が出力されます。

明示の変換

ユーザは型キャストを用いることにより、データ型を明示的に変換できます。型キャストの指定方法には、以下の2種類があります。前者はSQL標準で、後者はPostgreSQL独自の記法です。

CAST(値式 AS 型名)
値式::型名
  • 値式は、変換したい列名、値、または式です。
  • 型名は、変換後のデータ型です。ただし、適切な型変換操作が事前に定義されている必要があります。

具体例として、numeric型からinteger型への型キャストを使用したSELECT文を以下に示します。

SELECT CAST(10.5 / 3.0 AS INTEGER);

numeric型の除算結果がinteger型に変換され、小数部が丸められた整数値が出力されます。

次の例は、文字列型から数値型への型キャストを使用したSELECT文です。

SELECT 2 * '3.1415'::NUMERIC(4, 2);

text型の'3.1415'がnumeric型の 3.14 に変換され、数値計算が行われます。