データ型とは、文字や数字のようにデータの種類により変更させるデータの種類のことだ。データ型の数は数多く存在するが、ここでは代表的なデータ型を3つ紹介する。
目次
データ型とは
データ型とは、テーブルを構成する列に保存できるデータの種類だ。例えば、買い物データベースの中にカートテーブルと商品テーブルがあったとする。商品名の列は商品の名前の文字を保存するので、データ型は文字型だ。また、個数や単価は数値を保存するので、データ型は数値データ型だ。
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 |
削除などを行なえば、状況によって連続した番号に抜けが生じることがあるので注意が必要だ。
サンプルプログラム
このサンプルはここまで取り上げてきたいろいろな数値データ型に適当な値を保存している。また、その値が正しく保存されているかどうか分かるように保存したデータの表示も行なっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
create table sample1 ( --[1] integer_number integer, --[2] real_number real, --[3] double_precision_number double precision); --[4] insert into sample1(integer_number, --[5] real_number, --[6] double_precision_number) --[7] values('2147483647', --[8] '1111.22', --[9] '3333333.444444'); --[10] select * from sample1; --[11] create table sample2 ( --[20] decimal_number decimal, --[21] serial_number serial); --[22] insert into sample2(decimal_number) --[23] values('11111111.11111111'); --[24] insert into sample2(decimal_number) --[25] values('22222222.22222222'); --[26] select * from sample2; --[27] |
実行結果
データ型に対応して、正しく値が保存されている。ここで、注目して欲しいのは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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
create table sample ( --[1] character_varying_string character varying(5), --[2] varchar_string varchar(5), --[3] character_string character(10), --[4] char_string char(10), --[5] text_string text); --[6] insert into sample(character_varying_string, --[7] varchar_string, --[8] character_string, --[9] char_string, --[10] text_string) --[11] values('AB', --[12] 'DEFG', --[13] 'EFGHIJ', --[14] 'KLMNOPQR', --[15] 'STUVWXYZ12345'); --[16] select * from sample; --[17] |
実行結果
データ型に対応して、正しく値が保存されている。
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
create table sample ( --[1] date_data date, --[2] time_data time without time zone, --[3] time_zone_data time(2) with time zone, --[4] timestamp_data timestamp, --[5] timestamp_zone_data timestamp(3) with time zone); --[6] insert into sample(date_data, --[7] time_data, --[8] time_zone_data, --[9] timestamp_data, --[10] timestamp_zone_data) --[11] values('1999-01-08', --[12] '04:05:06', --[13] '04:05:06.78', --[14] '1999-01-08 04:05:06', --[15] '1999-01-08 04:05:06.789 PST'); --[16] select * from sample; --[17] |
実行結果
データ型に対応して、正しく値が保存されている。
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [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で考えるデータ型について参考にしていただければと思う。