目次
はじめに
Rails の開発でテーブル作成時に decimal と int を使い分けている PR を見かけたので、dicimal と int の違いについて調べてみました。
間違いあったらご指摘ください 🙇
結論
decimal は固定長整数型, integer は整数型(4 バイト)
decimal は、全体の桁数-精度(precision)と小数点以下の桁数(scale)を指定された浮動小数点データに対し、
integer は、整数だ!!!!
データ型種類一覧
データ型 | 種類 |
---|---|
primary_key | プライマリーキー |
string | 文字列型 |
text | テキスト型 |
integer | 整数型(4バイト) |
bigint | 整数型(8バイト) |
float | 浮動小数点数 |
decimal | 固定長整数型 |
numeric | 数値型 |
datetime | 日付と時刻(1000-01-01 00:00:00.000000から9999-12-31 23:59:59.999999) |
time | 時刻 (-838:59:59から838:59:59) |
date | 日付(1000-01-01から9999-12-31) |
binary | バイナリ文字列型 |
blob | Blob |
boolean | 真偽値型 |
Rails ドキュメントを参照しました。
integer と bigint の違い
integer:整数型(4 バイト)
bigint:整数型(8 バイト)
bigint は integer よりも大きい整数を扱うことができます。
Rails5.1 からは id カラムのデフォルトが bigint に変更になるようになりました。
id カラムが integer だと 4 バイトで 2,147,483,647 まで扱えるのに対し、
bigint が 8 バイトで 9,223,372,036,854,775,807 まで扱えるようになります。
これにより、より多くのレコードを扱えるようになります。
Pull Request はこちら
記事はこちら
decimal と numeric の違い
decimal:固定長整数型
numeric:数値型
Railsでは、decimalとnumericはどちらも10進数を格納するために使用されますが、許容される精度のレベルが異なります。
decimalは浮動小数点データ型で、小数点以下の桁数を固定で格納します。例えば、decimal(5, 2)と定義されたカラムには、最大5桁、小数点以下2桁の数字が格納されます。
この時の第一引数は、全体の桁数-精度(precision)を表し、第二引数は、小数点以下の桁数(scale)を表します。
numeric は decimal と似ていますが、SQL における decimal 型のエイリアスです。また、Railsでも同じ動作になります。
一般に、Railsではnumericよりもdecimalが好まれます。大きな数値に対するパフォーマンスが良く、格納される小数点以下の桁数が一貫して予測可能であるためです。
また、decimal は地図の緯度経度など、小数点以下の桁数が固定されている数値を格納する際などで使用されます。
まとめ
- decimal は固定長整数型, numeric は数値型, integer は整数型(4 バイト), bigint は整数型(8 バイト)
- はっきりとした、違いや使用例までは調べられなかったが、それぞれの特性を掴むことができたので、実際の開発で経験しながら、都度適切な型は何かを考えていきたい
参考記事
こちらは MySQL の話ですが、一応共有しておきます。