sagantaf

IT関連の技術記事を書くブログ。

PostgreSQL データ型メモ

 
大きく分けて3種類のデータ型が存在する。
 ①文字列データ型
 ②数値データ型
 ③日付・時刻データ型
 
 

①文字列データ型

 Character varying型:
  文字数に上限のある可変長の文字列型。varchar(桁数) でも宣言可能。
 Character型:
  文字列に上限のある固定長の文字列型。
  固定長なので、足りない部分には空白が入る。char(桁数) でも宣言可能。
 text型:
  文字数に上限のない可変長の文字列型。
 
実際に試してみる。まずはテーブルを作成。
postgres=# create table moji_data(
postgres(# varstring varchar(5),
postgres(# string char(5),
postgres(# moji text);
CREATE TABLE
postgres=#
postgres=#
postgres=# \d moji_data
           Table "public.moji_data"
  Column  |         Type                 | Modifiers
-----------+-----------------------+-----------
 varstring | character varying(5) |
 string      | character(5)           |
 moji        | text                        |
 
postgres=# 
 
データを挿入してみる。
postgres=# insert into moji_data values('ABCDE','AB','ABCDEFGHI');
INSERT 0 1
postgres=# select * from moji_data ;
 varstring | string   |   moji   
-----------+--------+-----------
 ABCDE   | AB       | ABCDEFGHI
(1 row)
 
 
宣言した桁数以上の文字数を格納しようとすると、エラーになる。
postgres=# insert into moji_data values('ABCDEあいう','AB','ABCDEFGHI');
ERROR:  value too long for type character varying(5)
postgres=# 
postgres=# insert into moji_data values('ABCDE','ABCDEFGH','ABCDEFGHI');
ERROR:  value too long for type character(5)
postgres=# 
 
 
文字列型はこの3つのみ。
気になるのは「どう使い分けるか」というところ。
 
charは自動的に空白が追加されてしまうので、注意が必要になる。
なぜなら、下記のようなことが起こり得るから。
 
postgres=# select * from moji_data ;
 varstring | string |   moji   
-----------+--------+-----------
 ABCDE     | test   | ABCDEFGHI
(1 row)
 
postgres=#
postgres=# select * from moji_data where string = '%est';
 varstring | string | moji
-----------+--------+------
(0 rows)
 
postgres=# select * from moji_data where string = 'test ';
 varstring | string |   moji   
-----------+--------+-----------
 ABCDE     | test   | ABCDEFGHI
(1 row)
 
postgres=# 
 
つまり空白を考慮せずに検索しようとすると、引っかからなくなる場合がある、ということ。
 
そのため、charは文字数を固定したい場合(一〜十の漢数字のみを格納するとか?)のみの利用に留めた方がよいのかも。
 
(文字列を固定したい場合がどんな時か、思いつかない。。。)
 
 
 
varcharは宣言した文字数しか格納できないため、文字数を統制することができる。
 
たとえば人名や都道府県などある程度の文字数が決まっているものは、varcharで宣言した方が、間違えて住所全てを記入してしまう、なとどいうことを防げる。
 
 
textは無制限に文字数を格納できるため、住所やアンケートの自由記入欄など、人によって何文字にもなり得る項目に設定することで長所を活かせる。
 
 
まとめると、こんな感じ↓
 
文字列型の使い分け方
 char型:固定文字数の文字列を格納したい時
 varchar型:文字数制限したい時
 text型:文字数が事前に把握できない時、どんな文字数であっても構わない時
 
 
(まとめてみると、当たり前のことを書いてるだけのような気がしてきた。。。)

 

②数値データ型

 integer:整数値。少数を入れたとしても四捨五入されて整数として格納される。
 numeric型:整数と少数を合わせて1000桁までの値を取れる数値型。全体の桁数と小数点以下の桁数を取ることができる。
  たとえば「numeric(6,2)」と宣言すると、9999.99までの値を格納することができる。
 
まずはテーブルを作成。 
postgres=# create table data(
postgres(# int integer,
postgres(# num numeric(6,2)
postgres(# );
CREATE TABLE
postgres=#
postgres=# \d data
        Table "public.data"
 Column |     Type          | Modifiers
----------+---------------+-----------
 int         | integer           |
 num      | numeric(6,2)  |
 
postgres=# 
 
データを挿入してみる。
postgres=# insert into data values(10.3, 1234.56);
INSERT 0 1
postgres=#
postgres=# select * from data;
 int   |  num 
-----+-------
  10  | 1234.56
(1 row)
 
postgres=# 
postgres=# insert into data values(10.8, 9.9);
INSERT 0 1
postgres=#
postgres=# select * from data;
 int   |  num 
-----+-------
  10  | 1234.56
  11  | 9.90
(2 rows)
 
上記の9.90のように桁数は自動で補われる。
 
他にも数値データ型は多数存在する。
下記ページに詳しくまとまっている。
 
PostgreSQLのデータ型とその挙動のまとめ(数値型)
 
 

③日付、時刻データ型

  data型:日付を格納するデータ型。
  time型:時刻を格納するデータ型。
  timestamp型:日付と時刻を格納するデータ型。