【初心者向け】PostgreSQLで考えるデータ型の種類とは?

  • このエントリーをはてなブックマークに追加
  • Pocket

データ型とは、文字や数字のようにデータの種類により変更させるデータの種類のことだ。データ型の数は数多く存在するが、ここでは代表的なデータ型を3つ紹介する。

このページではPostgreSQLで考えるデータ型についてご紹介した。参考にしていただければと思う。

データ型とは

データ型とは、テーブルを構成する列に保存できるデータの種類だ。例えば、買い物データベースの中にカートテーブルと商品テーブルがあったとする。商品名の列は商品の名前の文字を保存するので、データ型は文字型だ。また、個数や単価は数値を保存するので、データ型は数値データ型だ。

PostgreSQLが扱うデータ型には数値データ型や文字型以外にもさまざまなものがあるが、ここでは、代表的な数値型、文字型、日付/時刻データ型の3つを紹介する。

では、ひとつひとつの型を詳しく見てみよう。

数値データ型

数値データ型は、数値を扱うためのデータ型だ。その中にもいくつかのデータ型がある。

整数データ型

整数データ型は、整数を扱うためのデータ型だ。通常使われるのはintegerだが、数値の大きさによって小さければsmallintが使われ、大きければbigintが使われる。

なぜ、smallintとbigintが使われるかというと、integerで扱える数字の範囲が決まっているからだ。

以下の表はデータの型と範囲を示している。

データ型

大きさ

範囲

smallint

2バイト

-32768から+32767

integer

4バイト

-2147483648から+2147483647

bigint

8バイト

-9223372036854775808から

+9223372036854775807

しかし、大は小を兼ねるのだから何でもbigintにすればよいかというと、そうではない。データを保存するメモリやディスクが無制限にあるわけではない。また、データが大きければ処理する時間もかかる。このため、最適なデータ型を選ぶ必要がある。

浮動小数点データ型

浮動小数点データ型は、浮動小数点で表された数値を扱うデータ型だ。このデータ型にはrealとdouble precisionのふたつのデータ型がある。

データ型

大きさ

範囲

real

2バイト

6桁精度

double precision

4バイト

15桁精度

これらのデータ型を使うときには、注意が必要だ。保存した値と読み出した値が一致しない場合がある。不正確だということだ。

お金の計算など正確さを求められる場合は、次の「任意の精度を持つ数」を使うべきだ。

任意の精度を持つ数

任意の精度で正確な値の数値を扱うためのデータ型がnumericだ。同じデータ型として、decimalがあるが、これは全くnumericと同じだ。

データ型

大きさ

範囲

decimal

可変長

小数点より上は131072桁まで、小数点より下は16383桁まで

numeric

可変長

小数点より上は131072桁まで、小数点より下は16383桁まで

このデータ型は、足し算、掛け算、引き算で正確な結果を得ることができる。また、精度を指定することもできる。

書き方は3通りある。

次のように書けば、精度(precision)と小数点以下の桁(scale)を指定することができる。この場合、精度は小数点以外の数字の数になる。例えば、数値12.3456は精度が6で小数点以下の桁は4になる。

numeric(precision, scale)

精度だけを指定すると小数点以下の桁は0にみなされる。

numeric(precision,)

何も指定しなければ限界までの制度と小数点以下の桁が指定されたことになる。

numeric

前のセクションで述べたようにお金など正確さが求められる場合には、このデータ型を使うべきだ。

連番型

テーブルにひとつしかない番号を行に割り当てるデータ型だ。行を識別するために何か識別子を割り当てなければならないような場合に、このデータ型を使えば簡単にひとつしか存在しない識別子を割り当てることができる。

データ型

大きさ

範囲

smallserial

2バイト

1から32767

serial

4バイト

1から2147483647

bigserial

8バイト

1から9223372036854775807

削除などを行なえば、状況によって連続した番号に抜けが生じることがあるので注意が必要だ。

サンプルプログラム

このサンプルはここまで取り上げてきたいろいろな数値データ型に適当な値を保存している。また、その値が正しく保存されているかどうか分かるように保存したデータの表示も行なっている。

実行結果

データ型に対応して、正しく値が保存されている。ここで、注目して欲しいのはserial_numberの値が自動的に増えていることだ。

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] テーブルsample1を以下のデータ型と列の名前で作成する。
  • [2] データ型integerの列名integer_number
  • [3] データ型realの列名real_number
  • [4] データ型double precisionの列名double_precision_number
  • [5-10] テーブルsample1へ以下の値の行を追加する。
  • [8] integer_numberへ2147483647
  • [9] real_numberへ22
  • [10] double_precision_numberへ444444
  • [11] テーブルsample1に追加したデータをすべて表示する。
  • [20] テーブルsample2を以下のデータ型と列の名前で作成する。
  • [21] データ型decimalの列名decimal_number
  • [22] データ型serialの列名serial_number
  • [23-24] テーブルsample2へ以下の値の行を追加する。
  • [24] numeric_numberへ11111111
  • [25-26] テーブルsample2へ以下の値の行を追加する。
  • [25] numeric_numberへ22222222
  • [26] テーブルsample2に追加されたデータをすべて表示する。

文字型

文字型は文字列を扱うデータ型だ。文字列の種類に応じて、上限付き可変長、空白で埋められた固定長、制限なし可変長の3つがある。

では、上限付き可変長から紹介しよう。

上限付き可変長

上限付き可変長は文字列の長さの上限を指定して文字列を保存するデータ型だ。文字列の長さは引数nで指定できる。引数nはバイト数ではなく、文字の数だ。

以下のふたつの書き方がある。

データ型

説明

character varying(n)

短縮しない書き方

varchar(n)

character varying(n)を短縮した別の書き方

可変長とは文字列の長さに応じて保存される文字の長さが変わるということだ。

例えばnが5の時、保存しようとする文字の長さが5以下であれば、文字の長さだけ保存される。だが、文字の長さが5を超えた文字列を書き込もうとするとエラーになる。

空白で埋められた固定長

空白で埋められた固定長は、保存される文字列の長さが常に固定の長さになるデータ型だ。文字列の長さは引数nで指定できる。引数nはバイト数ではなく、文字の数だ。

以下のふたつの書き方がある。

データ型

説明

character(n)

短縮しない書き方

char(n)

character(n)を短縮した別の書き方

固定長とは保存する文字列の長さが固定ということだ。

例えば、保存しようとする文字の長さがn以下であれば、残りの部分をスペースで埋めて保存する。だが、文字の長さnを超えた文字列を書き込もうとするとエラーになる。

ただし、長さを超えた部分の文字がすべてスペースならばエラーにならず、指定された長さまで書き込まれる。

制限なし可変長

制限なし可変長は、文字列の長さを制限しないで、どんなに長い文字列でもそのまま文字列を保存するデータ型だ。

以下の書き方がある。

データ型

説明

text

書き方はひとつしかない

サンプルプログラム

このサンプルはここまで取り上げてきたいろいろな文字データ型に適当な値を保存している。また、その値が正しく保存されているかどうか分かるように保存したデータの表示も行なっている。

実行結果

データ型に対応して、正しく値が保存されている。

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] テーブルsampleを以下のデータ型と列の名前で作成する。
  • [2] データ型character varyingで長さ5の列名character_varying_string
  • [3] データ型varcharで長さ5の列名varchar_string
  • [4] データ型characterで長さ10の列名character_string
  • [5] データ型charで長さ10の列名char_string
  • [6] データ型textで列名text_string
  • [7-16] テーブルsampleへ以下の値の行を追加する。
  • [12] character_varying_stringへAB
  • [13] varchar_stringへDEFG
  • [14] character_stringrへEFGHIJ
  • [15] char_stringへKLMNOPQR
  • [16] text_stringへSTUVWXYZ12345
  • [17] テーブルsampleに追加したデータをすべて表示する。

日付/時刻データ型

日付/時刻データ型は日付と時刻を扱うデータ型だ。日付と時刻の種類に応じて、日付、時刻、タイムスタンプの3つがある。いずれも、グレゴリオ暦に従って計算された日付になる。

では、日付から紹介しよう。

日付

日付データ型は日付を扱うためのデータ型だ。時刻はない。AD/BC(紀元前/紀元後)をオプションとして付けることができる。

以下の表はデータの型と範囲を示している。

データ型

大きさ

範囲

date

4バイト

4713 BCから5874897 AD

注意しなければならないのは、年月日の入力の仕方だ。海外では、月-日-年の順番になっている。日本では、年-月-日の順だ。この順番はDateStyleパラメータで日付のモードを設定できる。YMDモードを設定すれば年月日、MDYは月日年、DMYは日月年となる。

以下の例は、代表的なの日付の書き方とその保存結果だ。

書き方の例

結果

1999-01-08

すべてのモードで1999年1月8日となる。(推奨書式)

January 8, 1999

すべてのモードで1999年1月8日となる。曖昧さがない。

1/8/1999             

MDYモードは1月8日、DMYモードは8月1日。

1/18/1999

MDYモードは1月18日、他のモードは受け付けない。

Jan-08-1999

すべてのモードで1月8日になる。

他にもいろいろな書き方がある。モードによって結果が異なる場合もあるので、必要に応じて仕様を確かめることが必要だ。

時刻

時刻データ型はある日の時刻を扱うためのデータ型だ。日付はない。時間帯をオプションとして付けることができる。

以下の表はデータの型と範囲を示している。without time zoneは時間帯指定無しで、with time zoneは時間帯指定付きだ。

データ型

大きさ

範囲

time [ (p) ] without time zone

8バイト

00:00:00              から24:00:00

time [ (p) ] with time zone

12バイト

00:00:00+1459から24:00:00-1459

time

8バイト

time [ (p) ] without time zoneと同じ

以下の例はwithout time zoneの代表的な時刻の書き方の例とその結果だ。

書き方の例

結果

04:05:06

4時5分6秒になる

04:05:06.789

4時5分6秒789になる

時刻の秒に保存される精度をpによって小数点以下の桁数を指定できる。デフォルトでははっきりとした限界はない。8バイト整数が使用される場合は、pは0から6だ。浮動小数点が使われると、pは0から10だ。

以下の例はwith time zoneだ。

書き方の例

結果

04:05:06 PST

米国太平洋標準時間(省略形)の4時5分6秒

2003-04-12 04:05:06 America/New_York

2003年4月12日のニューヨーク時間4時5分6秒になる

他にもいろいろな書き方がある。必要に応じて仕様を確かめることが必要だ。

タイムスタンプ

タイムスタンプ型は日付と時刻を扱うためのデータ型だ。時間帯やAD/BC(紀元前/紀元後)をオプションとして付けることができる。

以下の表はデータの型と範囲を示している。

データ型

大きさ

範囲

timestamp [ (p) ] [ without time zone ]

8バイト

4713 BCから5874897 AD

timestamp [ (p) ] with time zone

8バイト

4713 BCから5874897 AD

以下の例はwithout time zoneの代表的なタイムスタンプの書き方の例とその結果だ。

入力の例

結果

1999-01-08 04:05:06

1991年1月8日の4時5分6秒になる

以下の例はwith time zoneだ。

入力の例

結果

1999-01-08 04:05 PST

1991年1月8日の米国太平洋標準時間(省略形)の4時5分になる

他にもいろいろな書き方がある。必要に応じて仕様を確かめることが必要だ。

サンプルプログラム

このサンプルはここまで取り上げてきたいろいろな日付/時刻データ型に適当な値を保存している。また、その値が正しく保存されているかどうか分かるように保存したデータの表示も行なっている。

実行結果

データ型に対応して、正しく値が保存されている。

サンプルプログラムの説明

それでは簡単にプログラムの解説をしてゆこう。

  • [1] テーブルsampleを以下のデータ型と列の名前で作成する。
  • [2] データ型dateの列名date_data
  • [3] データ型timeの列名time_data
  • [4] データ型time(2) with time zoneの列名timestamp
  • [5] データ型timestamp_dataの列名time_zone_data
  • [6] データ型timestamp(3)の列名timestamp_zone_data
  • [7-11] テーブルsampleへ以下の値の行を追加する。
  • [12] date_dataへ1999-01-08
  • [13] time_dataへ04:05:06
  • [14] time_zone_dataへ04:05:06.78
  • [15] timestamp_dataへ1999-01-08 04:05:06
  • [16] timestamp_zone_dataへ1999-01-08 04:05:06.789 PST

まとめ

このページではPostgreSQLで考えるデータ型の種類について簡単にご紹介した。

今回、紹介したPostgreSQLのサンプルプログラムも活用していただきたい。

PostgreSQLで考えるデータ型について参考にしていただければと思う。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*

ゼロからエンジニアを目指す方へ
短期間でエンジニアになる方法

必要な勉強や技術の最新動向、本当に使えるIT資格、学習に役立つ国からの奨励金などの情報を無料でお届け

資料を見てみる