読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Postgresqlのデータ型一覧とRailsのマイグレーションの指定方法

Rails Migration Rails中級 DB

Postgresqlの各データ型とRailsのマイグレーションでの指定方法をまとめました。
次の目次にある、データ型についてまとめました。

動作確認

  • Ruby 2.2.0
  • Rails 4.2.1
  • Postgresql 9.4.1


数値データ型

数値データ型には2、4、8バイト整数と、4、8バイト浮動小数点、精度設定が可能な数があります。

型名格納サイズ説明範囲
smallint2バイト狭範囲の整数-32768から+32767
integer4バイト典型的に使用する整数-2147483648から+2147483647
bigint8バイト広範囲整数-9223372036854775808から+9223372036854775807
decimal可変長ユーザ指定精度、正確、通貨などに使用小数点前までは131072桁、小数点以降は16383桁
numeric可変長decimalと同じ小数点前までは131072桁、小数点以降は16383桁
real4バイト可変精度、不正確6桁精度
double precision8バイト可変精度、不正確15桁精度
smallserial2バイト狭範囲自動整数1から32767
serial4バイト自動増分整数1から2147483647
bigserial8バイト広範囲自動増分整数1から9223372036854775807

# マイグレーションファイル
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.integer :int2, limit: 2 # smallint型
      t.integer :int4, limit: 4 # integer型
      t.integer :int            # integer型
      t.integer :int8, limit: 8 # bigint型

      t.decimal :decimal, precision: 10, scale: 2 # decimal/numeric(10,2)型

      t.float :real, limit: 4   # real型
      t.float :double_precision # double precision型
  end
end


通貨型

money型は貨幣金額を固定精度の小数点で格納します。
範囲は小数点2桁を想定しています。出力形式は通常は"典型的な"通貨書式となりますが、ロケールによって異なります。

型名格納サイズ説明範囲
money8バイト貨幣金額-92233720368547758.08 から +92233720368547758.07

# マイグレーションファイル
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.money :money # money型
    end
  end
end

文字型

型名説明
character varying(n)varchar(n)上限付き可変長
character(n)char(n)空白で埋められた固定長
text制限なし可変長

# マイグレーションファイル
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.string :str                # character varying型
      t.string :str128, limit: 128 # character varying(128)型
      t.text   :text               # text型
    end
  end
end


日付/時刻データ型

型名格納サイズ説明最遠の過去最遠の未来精度
timestamp [ (p) ] [ without time zone ]8 バイト日付と時刻両方(時間帯なし)4713 BC294276 AD1μ秒、14桁
timestamp [ (p) ] with time zone8バイト日付と時刻両方、時間帯付き4713 BC294276 AD1μ秒、14桁
date4バイト日付(時刻なし)4713 BC5874897 AD1日
time [ (p) ] [ without time zone ]8バイト時刻(日付なし)00:00:0024:00:001μ秒、14桁
time [ (p) ] with time zone12バイトその日の時刻のみ、時間帯付き00:00:00+145924:00:00-14591μ秒、14桁
interval [ fields ] [ (p) ]16バイト時間間隔-178000000年178000000年1μ秒、14桁

# マイグレーションファイル
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.datetime  :datetime  # timestamp without time zone型
      t.timestamp :timestamp # timestamp without time zone型
      t.timestamp :timestamp # timestamp without time zone型
      t.time      :time      # date型
      t.date      :date      # time without time zone型
      t.column    :duration, :interval # interval型
      t.column :timestamp_with_tz, 'timestamp with time zone'
      t.column :time_with_tz,      'time with time zone'
    end
  end
end


論理値データ型

boolean型はいくつかの状態を取ることができます。 "真"もしくは"偽"、そして第3の状態はSQLではNULL値で表現される"不明"の状態です。

名前格納サイズ説明
boolean1バイト真または偽の状態

# マイグレーションファイル
class CreateHoges < ActiveRecord::Migration
  def change
    create_table :hoges do |t|
      t.boolean   :bool # boolean型
    end
  end
end

他にもバイナリ型やJSON型などのデータ型もあるので気にになる方は、参考のURLを一度読んでみてください。