【絶対に覚えておきたい】MySQLの基本データ型

## 数値型
### 整数型
<INS>整数値を格納するデータ型</INS>

| 型 | ストレージサイズ | 符号付き | 符号なし |
|:-----------|:------------|:------------|:------------|
| **TINYINT** | 1バイト | -128 ～ 127 | 0～255 |
| **SMALLINT** | 2バイト | -32768 ～ 32767 | 0～65535 |
| **MEDIUMINT** | 3バイト | -8388608 ～ 8388607 | 0～16777215 |
| **INT** | 4バイト | -2147483648 ～ 2147483647 | 0～4294967295 |
| **BIGINT** | 8バイト | -2の63乗 ～ 2の63乗-1 | 	0～2の64乗-1 |

符号付き（`signed`）→ 正の整数と負の整数の両方を扱う。整数型のデフォルト設定。
符号なし（`unsigned`）→ 正の整数のみを扱う。整数型のオプション設定。

- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：0
- ストレージサイズはメモリやディスクの使用量とパフォーマンスに関わる
- データの範囲に応じて適切な型を選択する必要がある

:::note warn
- MySQL 8.0.17以降、表示幅属性とZEROFILL属性は非推奨
:::

### 固定小数点型（DECIMAL型 / NUMERIC型）
<INS>小数部の桁数を固定した数値を格納する真数値データ型</INS>
（DECIMAL型とNUMERIC型はどちらも実質的な違いはなく動作も同じ）

- 定義の形式：`DECIMAL(M, D)`（`M`は全体の桁数、`D`は小数部の桁数）
- 例：`DECIMAL(5, 2)` → -999.99 〜999.99を格納可能
- ストレージサイズ：数値の桁数に基づく
- 最大桁数：65
- 小数部の桁数のデフォルト値：0
- 格納される値が指定された精度や桁数に収まらない場合、自動的に丸められる

:::note info
金融計算や組み込みシステムなど、精度が重要で範囲が限定されている数値を扱う場合に適している。
:::

### 浮動小数点型
<INS>小数部の桁数が可変長の実数を格納する概数値データ型</INS>

| 型 | ストレージサイズ | 精度 | 許容値 |
|:------------|:------------|:------------|:------------|
| **FLOAT** | 4バイト | 約7桁の10進数 | -3.402823466E+38 〜 -1.175494351E-38、0、1.175494351E-38 〜 3.402823466E+38 |
| **DOUBLE** | 8バイト | 約15桁の10進数 | -1.7976931348623157E+308 〜 -2.2250738585072014E-308、0、2.2250738585072014E-308 〜 1.7976931348623157E+308

- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：0
- 格納される値が指定された精度や桁数に収まらない場合、自動的に丸められる
- 概数値である特性上、精度の損失が発生する場合があるため、高精度が求められる用途には固定小数点型の仕様が推奨される

:::note warn
MySQL 8.0.17以降、`FLOAT(M, D)`および`DOUBLE(M, D)`構文は非推奨
:::

:::note info
科学技術計算やグラフィックス処理など、広範囲の数値を扱う場合に適している。
:::

### ビット値型（BIT型）
<INS>ビット値を格納するデータ型</INS>
- 定義の形式：`BIT(M)`（`M`は1〜64のビット数）
- ストレージサイズ：指定したビット数に基づく
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：0
- ビット値の指定形式：`b'value'`（`value`は0と1で表すバイナリ値）
- カラムに格納されたバイナリデータは、使用するツールやクライアントによって表示形式が異なる（以下、例）
- **バイナリ形式**：整数値1は0001、整数値10は1010のように表す（4ビットの場合）
- **16進数形式**：整数値1は0x01、整数値10は0x0Aのように表す

:::note info
フラグやバイナリ情報など、ビットデータを扱う場合に適している。
:::

## 日時型
### DATE型
<INS>日付情報を格納するデータ型</INS>
- 値の形式：`YYYY-MM-DD`
- 値の範囲：'1000-01-01' 〜 '9999-12-31'
- ストレージサイズ：3バイト
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：'0000-00-00'
- '0000-00-00'は値の範囲外であるため、途中でNOT NULL制約をつける際は範囲内のDEFAULT値の設定も必要

### DATETIME型
<INS>日時情報を格納するデータ型</INS>
- 値の形式：`YYYY-MM-DD hh:mm:ss`
- 値の範囲：'1000-01-01 00:00:00' 〜 '9999-12-31 23:59:59'
- ストレージサイズ：8バイト
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：'0000-00-00 00:00:00'
- '0000-00-00 00:00:00'は値の範囲外であるため、途中でNOT NULL制約をつける際は範囲内のDEFAULT値の設定も必要

### TIMESTAMP型
<INS>タイムゾーンを考慮した日時情報を格納するデータ型</INS>
- 値の形式：`YYYY-MM-DD hh:mm:ss`
- 値の範囲：'1970-01-01 00:00:01' UTC 〜 '2038-01-19 03:14:07' UTC
- ストレージサイズ：4バイト
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：'0000-00-00 00:00:00'

### TIME型
<INS>時間を表現するためのデータ型</INS>
- 値の形式：`hh:mm:ss`
- 値の範囲：'-838:59:59' 〜 '838:59:59'
- ストレージサイズ：3バイト
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：'00:00:00'
- カラムに省略された値（コロン付き）を割り当てると、'11:22'は'11:22:00'に変換される
- カラムに省略された値（コロンなし）を割り当てると、1122および'1122'は'00:11:22'となる

### YEAR型
<INS>年を表現するためのデータ型</INS>
- 値の形式：`YYYY`
- 範囲：1901〜2155、および0000
- ストレージサイズ：1バイト
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：0000
- カラムに省略された文字列を割り当てると、'0'〜'69'は2000〜2069、'70'〜'99'は1970〜1999のYEAR値に変換される
- カラムに省略された数値を割り当てると、1〜69は2001〜2069、70〜99は1970〜1999、0および00は0000のYEAR値に変換される

## 文字列型
### CHAR型
<INS>固定長の文字列を格納するデータ型</INS>
- 定義の形式：`CHAR(M)`
- ストレージサイズ：最大255バイト（指定した長さに依存）
- 最大値：255
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：空文字
- 定義した長さに満たない場合、空白でパディングされる

:::note info
国コード（例：US、JP）などのように、常に同じ長さのデータを扱う場合に適している。
:::

### VARCHAR型
<INS>可変長の文字列を格納するデータ型</INS>
- 定義の形式：`VARCHAR(M)`
- ストレージサイズ：最大65,535バイト（その他のカラムとの組み合わせによって変わる）
- 最大値：65,535
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：空文字

:::note info
名前、住所、説明など、長さが変動するデータを扱う場合に適している。
:::

### BINARY型
<INS>固定長のバイナリデータを格納するデータ型</INS>
- 定義の形式：`BINARY(M)`
- ストレージサイズ：最大255バイト（指定した長さに依存）
- 最大値：255
- 定義した長さに満たない場合、パッド値（0x00）でパディングされる

:::note info
ハッシュ値や固定長の識別子といった固定サイズのバイナリデータを扱う場合に適している。
:::

### VARBINARY型
<INS>可変長のバイナリデータを格納するデータ型</INS>
- 定義の形式：`VARBINARY(M)`
- ストレージサイズ：最大65,535バイト（その他のカラムとの組み合わせによって変わる）
- 最大値：65,535

:::note info
画像データやファイルのバイナリ内容といった可変サイズのバイナリデータを扱う場合に適している。
:::

### TEXT型
<INS>サイズの大きい可変長の文字列を格納するデータ型</INS>
- ストレージサイズ：最大65,535バイト（64KB）
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：空文字
- DEFAULT値の設定はできない
- 他にもサイズが異なる`TINYTEXT型`、`MEDIUMTEXT型`、`LONGTEXT型`がある

:::note info
長文の説明、コメント、記事などのサイズの大きい文字列データを扱う場合に適している。
:::

### BLOB型
<INS>サイズの大きい可変長のバイナリデータを格納するデータ型</INS>
- ストレージサイズ：最大65,535バイト（64KB）
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：空文字
- DEFAULT値の設定はできない
- 他にもサイズが異なる`TINYBLOB型`、`MEDIUMBLOB型`、`LONGBLOB型`がある

:::note info
音声ファイル、動画、ドキュメントなどのサイズの大きいバイナリデータを扱う場合に適している。
:::

### ENUM型
<INS>定義された選択肢の中から1つの値のみを格納するデータ型</INS>
- 定義：`ENUM('a', 'b', 'c'...)`
- 要素の最大数：65,535
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：定義した選択肢の最初の値
- NULL値を持つことができるため、未選択の状態を表現できる

:::note info
性別やステータスなどの選択肢が限られるデータを扱う場合に適している。
:::

### SET型
<INS>定義された選択肢の中から複数の値を格納するデータ型</INS>
- 定義：`SET('a', 'b', 'c'...)`
- 要素の最大数：64
- NOT NULL制約を付けた場合に既存レコードに割り当てられる値：空文字
- NULL値を持つことができるため、未選択の状態を表現できる

:::note info
ユーザーの権限や設定などの、複数の値の組み合わせのデータを扱う場合に適している。
:::