個人的な備忘録：データベースのテーブル型を深く理解するため、記事としてアウトプットしてみた

## はじめに
データ型を正しく理解し、適切に選択することは、データの品質を保ち、システムの効率化や将来的な運用の安定性を確保するために欠かせません。

:::note warn
***これは、データベースの設計や管理を行う上で、基盤となる重要なスキルだと考えています。***
:::

この記事では、データ型に関する基本的なポイントをまとめています。**あくまで個人的な備忘録として作成したものですが、少しでも参考になれば幸いです。**

## 書こうと思ったきっかけ
これまでデータベースのテーブル設計を行った経験は数えるほどで、2～3回程度しかありません。

しかし、その少ない経験の中で、「**どのデータ型を選択するのが適切なのか**」と迷うことが多々ありました。

:::note alert
**そこで、改めてデータ型の選択について整理し、まとめてみようと思ったのがきっかけです。**
:::

特に、私は困ったときによく「**VARCHAR**」を選んでしまう傾向があるのですが、それが本当に正しい判断なのか、体系的に見直しておきたいと感じました。

***この記事の内容は、自分自身の学びの記録として書いている部分が多いですが、同じような悩みを持つ方の参考になれば嬉しいです。***

## データベースのテーブルの型
データベースのデータ型は、大きく以下の4つの枠組みに分類されます。

:::note note
- **数値型 (Numeric)**  
  数値を扱うデータ型。例：整数、小数など。

- **文字列型 (String/Text)**  
  文字やテキストを扱うデータ型。例：名前や説明文。

- **日付・時刻型 (Date/Time)**  
  日時や時間を扱うデータ型。例：日付、時刻、タイムスタンプ。

- **その他の型 (Other/Complex)**  
  特殊なデータを扱う型。例：バイナリデータ、JSON、XML、地理データなど。
:::

これらのデータ型を適切に組み合わせて使用することが重要です。

***次に、それぞれのデータ型がどのようなデータ形式を扱うことができるのか、詳しく確認していきます。***

## 1. 数値型
数値を格納するための型について説明します。

***数値型は主に整数型、浮動小数点型、固定小数点型に分類されます。***

### 整数型

整数を格納するためのデータ型です。***格納できる範囲と用途に応じて以下の型を選択します。***

- **TINYINT** (1バイト): 小さな整数。`-128～127` または `0～255`。
- **SMALLINT** (2バイト): `-32,768～32,767` または `0～65,535`。
- **MEDIUMINT** (3バイト): `-8,388,608～8,388,607`。
- **INT** または **INTEGER** (4バイト): `-2,147,483,648～2,147,483,647`。
- **BIGINT** (8バイト): 非常に大きな整数を格納可能。

### 浮動小数点型

小数点を含む数値を格納しますが、精度に注意が必要です。

- **FLOAT** (4バイト): 小数点を含む数値。精度は限定的。
- **DOUBLE** または **REAL** (8バイト): 高精度の小数。

### 固定小数点型

小数点を含む数値を正確に格納します。***主に金額や割合を扱う際に利用されます。***

- **DECIMAL** または **NUMERIC**: 精度を指定して格納する小数点を含む数値。金額計算などで使用。

---

## 2. 文字列型
文字列型は、文字やテキストを格納するためのデータ型で、用途や文字列の長さに応じてさまざまな型があります。

### 固定長文字列

固定長の文字列を格納します。例えば、`CHAR(10)`と指定すると、常に10文字分のスペースが確保されます。

- **CHAR(n)**: n文字の固定長文字列。短い文字列で効率的。

### 可変長文字列

可変長の文字列を格納します。***例えば、`VARCHAR(100)`と指定すると、100文字以内であれば必要な分だけ格納されます。***

- **VARCHAR(n)**: 最大n文字の可変長文字列。一般的な用途。

### テキスト型

大量のテキストを保存する場合に使用される型で、格納可能な文字数に応じていくつかの種類があります。

- **TINYTEXT**: 255文字までの文字列。
- **TEXT**: 65,535文字までの文字列。
- **MEDIUMTEXT**: 16,777,215文字までの文字列。
- **LONGTEXT**: 4,294,967,295文字までの文字列。

---

## 3. 日付・時刻型
データベースでは、日付や時刻、バイナリデータを扱うために専用の型が用意されています。***それぞれの型について、特徴と用途を分かりやすくまとめました。***

- **DATE**: 年月日 (YYYY-MM-DD)。
- **DATETIME**: 年月日と時刻 (YYYY-MM-DD HH:MM:SS)。
- **TIMESTAMP**: UNIXタイムスタンプ形式。タイムゾーンを扱いやすい。
- **TIME**: 時間 (HH:MM:SS)。
- **YEAR**: 年 (YYYY)。

---

## 4. バイナリ型
バイナリ型は、バイナリデータ（画像、動画、ファイルなど）を格納するためのデータ型です。***用途やデータサイズに応じて使い分けます。***

- **BINARY(n)**: 固定長バイナリデータ。
- **VARBINARY(n)**: 可変長バイナリデータ。
- **BLOB**: バイナリラージオブジェクト（画像やファイルなど）。
  - **TINYBLOB**: 255バイトまで。
  - **BLOB**: 65,535バイトまで。
  - **MEDIUMBLOB**: 16,777,215バイトまで。
  - **LONGBLOB**: 4,294,967,295バイトまで。

---

## 5. 特殊型
データベースには、一般的な数値型や文字列型以外にも、特定の用途に特化した「特殊型」があります。

***また、データ型を選択する際には、効率性やストレージの最適化を考慮することが重要です。***

- **ENUM**: 定義されたリストから1つの値を選択 (例: `'male'`, `'female'`)。
- **SET**: 定義されたリストから複数の値を選択 (例: `'a,b,c'`)。

---

## データ型選択の注意点
### 選択の基準
- データ型は用途や効率性を考慮して選びます。例: ID列には `INT` または `BIGINT` を使うことが一般的。

### サイズの最適化
- 必要以上に大きな型を使うと、ストレージとメモリの無駄遣いになります。

### 文字コード
- 文字列型を使う場合は、使用する文字コード (例: `utf8mb4` など) に注意。

### NULLの扱い
- 列にNULL値を許可するかどうかは、要件に基づいて設定します。

## まとめ

最後までお読みいただき、ありがとうございました。***今回は、少し馴染みの薄い内容かもしれませんが、データベースのデータ型について記事として整理してみました。***

:::note warn
**おかげで、自分自身の知識も体系的にまとまったように感じています。**
:::

この記事が、皆さんの設計や学習のお役に立てば幸いです！