decimal と int の違いってなんや？

# 目次

1. [はじめに](#はじめに)
2. [結論](#結論)
3. [データ型種類一覧](#データ型種類一覧)
4. [integer と bigint の違い](#integer-と-bigint-の違い)
5. [decimal と numeric の違い](#decimal-と-numeric-の違い)
6. [参考URL](#参考url)

## はじめに

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 ドキュメント](https://railsdoc.com/page/add_column)を参照しました。


## 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 は[こちら](https://github.com/rails/rails/pull/26266)
記事は[こちら](https://www.mccartie.com/tech/2016/12/05/rails-5.1.html)

## 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 バイト)
- はっきりとした、違いや使用例までは調べられなかったが、それぞれの特性を掴むことができたので、実際の開発で経験しながら、都度適切な型は何かを考えていきたい

## 参考記事

https://railsdoc.com/page/add_column

https://www.mccartie.com/tech/2016/12/05/rails-5.1.html

https://kossy-web-engineer.hatenablog.com/entry/2020/12/13/111823

https://edgeapi.rubyonrails.org/classes/ActiveModel/Type/Decimal.html

https://railsguides.jp/active_record_migrations.html#%E3%82%AB%E3%83%A9%E3%83%A0%E4%BF%AE%E9%A3%BE%E5%AD%90

https://docs.ruby-lang.org/ja/latest/class/Numeric.html

こちらは MySQL の話ですが、一応共有しておきます。

https://qiita.com/y-ken/items/b8601092d0261c3a556d