【MySQL】データ型について


# はじめに
SQL文についての記事でデータ型について軽く触れようと調べた際に
そもそも知らない型があるな？となったので、改めて調べてアウトプットしていこうと思います。
全てを網羅したわけではないので悪しからず！

# 文字列型
| 型     　| 種類|値の範囲 　                  |
| ------ | --- |------------------- |
|CHAR(m)    | 固定長 | m:0~255文字<br>指定された長さになるよう末尾が空白で埋められ、<br>値が格納、取得される時は空白は削除される |
|VARCHAR(m) | 可変長 | m:0~65,535文字<br>末尾に空白を含む文字列を格納すると末尾の空白は削除されず、<br>格納、取得される時は空白を含む |

※固定長：データの文字数が決まっていること（商品コードや郵便番号など）
※可変長：データの文字数が決まっていないこと（氏名や商品名など）

# バイナリ型
| 型     　  | 種類 |値の範囲 　                  |
| -------- | --- | ------------------- |
|BINARY(m) | 固定長 | m:0~255バイト<br>指定された長さになるよう末尾が0x00で埋められる。<br>値が格納、取得される時は0x00は削除されない |
|VARBINARY(m) | 可変長 | m:0~65,535バイト<br>末尾に0x00は格納されない |

## 0x00とは
冒頭2桁の`0x`は16進数であることを示していて、後の数字で数字やアルファベット、特定の意味を持つ。
文字コード表に当てはめて考えると、0x00は`NUL`という意味になる。

## バイトとは
コンピューターの情報量を表すときに使用される単位。
1バイト=半角英数字1文字分の情報量で、全角文字の場合は1文字で2バイトとなる。
1バイト＝8ビット（bit）。

- 1KB（キロバイト）＝ 1,024 Byte
- 1MB（メガバイト）＝ 1,024 KB
- 1GB（ギガバイト）＝ 1,024 MB
- 1TB（テラバイト）＝ 1,024 GB

ちょっと（だいぶ）蛇足
過去にPC修理センターで働いてる時、度々STOPエラーを見かけることがあったけど、
あのコードは16進数を表してたんだなぁと今更ながらに知りました（笑）
これはこれでパズルみたいで紐解くの楽しそうなので、そのうち少し掘り下げて調べてみようと思います。
バイトに関してもメモリだったりHDD容量でよく見かけたなぁと。すっかり忘れてました。

## BLOB型、TEXT型について
| 型      　| 最大バイト |
| ------- | -------- |
| TINYBLOB | 255     |
| BLOB     | 65,535|
| MEDIUMBLOB | 16,777,215 |
| LONGBLOB | 4,294,967,295 |
| TINYTEXT | 255 |
| TEXT     | 65,535 |
| MEDIUMTEXT | 16,777,215   |
| LONGTEXT |  4,294,967,295 |

それぞれ巨大なバイナリデータ(画像ファイルなど)とテキストデータを格納する時に利用される。

BLOB 型はバイナリデータを扱うデータ型で、格納できるデータのサイズを指定しないが、最大長は決まっている。
※VARBINARY型で格納できるバイト数を指定しなかったもの。

TEXT 型は文字列データを扱うデータ型で格納できるデータのサイズを指定しないが、最大長は決まっている。
※VARCHAR型で格納できるバイト数を指定しなかったもの。

### 日付・時刻型
| 型　| 内容 　                  |
| ------  | ---------------------- |
|DATE     | 日時(年月日)。フォーマットは「YYYY-MM-DD」 |
|DATETIME | 日時(年月日時分秒)。フォーマットは「YYYY-MM-DD HH:MM:SS」|
|TIMESTAMP| 日時(年月日時分秒)。DATETIME型とフォーマットは同じだが、扱えるデータ範囲が狭い|
|TIME     | 時刻(時分秒。フォーマットは「HH:MM:SS」で、「HH：MM」や「MM:SS」での指定が可能|
|YEAR     | 年。フォーマットは「YYYY」で、下2桁での指定も可能|

# 整数型(真数値)
| 型           　| バイト |扱える値の範囲            | UNSIGNED |　ZEROFILL |
| ------------ | ---- |---------------------- | --------- | ------- |
| TYNYINT      | 1    | -128～127              | 0~255      | 000<br>~255 |
| SMALLINT     | 2    | -32768～32767          | 0~65536    | 00000<br>～65536 |
| MEDIUMINT    | 3    | -8388608～8388607      | 0~16777215 | 00000000<br>～16777215 |
| INTEGER(INT) | 4    | -2147483648～2147483647 | 0~4294967295 | 0000000000<br>～4294967295 |
| BIGINT       | 8    | -9223372036854775808<br>～9223372036854775807 | 0～18446744073709551615 | 00000000000000000000<br>～18446744073709551615 |

上記の違いは保存できる値の範囲(桁数)が違う。
また、ストレージを使用できるバイト数の違いでもある。

■ UNSIGNED
UNSIGNEDオプションを付けると符号を禁止することができ、
負の数を使用しないことで<b>正の数は２倍の大きさまで</b>使用することができる。

■ ZEROFILL
ZEROFILLオプションを付けると、<b>入力した数字に対して最大桁数まで前方を自動的にゼロ埋め</b>して登録される。
例えば「TYNYINT ZEROFILL」を指定した場合、「32」と入力すると「032」と登録される。
ZEROFILLを使用する場合、負の数は使用できない（UNSIGNEDを指定したのと同じ）状態になる。

# 固定小数点型 (真数値) 
| 型　| 値の範囲 　                  |
| ------- | ---------------------- |
| DECIMAL(m,n) | 整数部＋小数部の合計桁数及び小数部に割り当てる桁数を事前に定める<br>m：1～65桁(全体の桁数)<br>n：0～30桁(少数部の桁数を指定する整数)　|

小数点以下を必要とする場合に使用する。
例えば`DECIMAL(5,2)`と指定した場合、小数点以下が2桁になるため整数部分は3桁となる。
具体的な値としては`-999.99~999.99`となる。

# 浮動小数点型 (概数値)
| 型　         | バイト   | 値の範囲 　                  |
| ---------- | ----- | ----------------- |
| FLOAT      | 4 | 3.402823466E+38～3.402823466E+38 |
| FLOAT(m,n) | 4 | m：1～255桁(全体の桁数)<br>n：0～30桁(少数部の桁数を指定する整数)　まで指定可能
| DOUBLE     | 8 | -1.7976931348623157E+308～1.7976931348623157E+308 |
| DOUBLE(m,n)| 8 | m：1～255桁(全体の桁数)<br>n：0～30桁(少数部の桁数を指定する整数)　まで指定可能 |

小数点以下を必要とする場合に使用する。
上記の違いは使用するストレージのサイズと小数点以下の計算精度が違い、
「DOUBLE」は「FLOAT」の倍の精度で計算する。
※MySQLにおいては全ての計算が「倍精度」で行わているので、意図しなければ「DOUBLE」を使用する。

■UNSIGNED
整数型同様に負の数の入力を禁止することができるが、<b>範囲は２倍にならない</b>。
桁数を指定した場合は自動的にUNSIGNED同然となり、負の数を入力することができなくなる。

■ZEROFILL
こちらも整数型同様に、ゼロ埋めして入力することができる。

# 最後に
他にもBIT型やENUM型などありますが、だいぶ長くなってしまったのでここら辺で。
また理解が深まったりしたら更新していこうと思います！

# 参考サイト
https://blog.s-giken.net/367.html

https://proengineer.internous.co.jp/content/columnfeature/6728#section200

https://dev.mysql.com/doc/

https://www.javadrive.jp/mysql/type/