はじめに
こんにちは。
プログラミング初心者wakinozaと申します。
Java勉強中に調べたことを記事にまとめています。
十分気をつけて執筆していますが、なにぶん初心者が書いた記事なので、理解が浅い点などあるかと思います。
間違い等あれば、指摘いただけると助かります。
記事を参考にされる方は、初心者の記事であることを念頭において、お読みいただけると幸いです。
対象読者
- MySQLを勉強中の方
記事のテーマ
- MySQLについて勉強しています
- この記事では、「MySQL 8.4.6」の代表的なデータ型についてまとめていきます
目次
1.数値データ型
2.文字列データ型
3.日時データ型
4.BOOLEAN型の扱い方
本文
MySQLのデータ型は、大きく分けると5種類に分類できます。
- 数値データ型
- 文字列データ型
- 日時データ型
- 空間データ型
- JSONデータ型
この記事では、使用頻度の高い「数値データ型」「文字列データ型」「日時データ型」について説明していきます。
1. 数値データ型
| 分類 | 型名 | バイト数 | 型の最大値 | 備考 |
|---|---|---|---|---|
| 整数型 | TINYINT | 1 | 127 | |
| SMALLINT | 2 | 32,767 | ||
| MEDIUMINT | 3 | 8,388,607 | ||
| INTEGER | 4 | 2,147,483,647 | 「INT」もシノニム(別名)として利用可能 | |
| BIGINT | 8 | $$ 2^{63} - 1 $$ | ||
| 固定小数点 | DECIMAL(P,S) | Pは全体の最大桁数(精度)を、Sは小数点以下の桁数(スケール)を指定する | ||
| NUMERIC(P,S) | Pは全体の最大桁数(精度)を、Sは小数点以下の桁数(スケール)を指定する | |||
| 浮動小数点 | FLOAT | 4 | 有効桁数 約7桁 | |
| DOUBLE | 8 | 有効桁数 約15桁 | ||
| ビット型 | BIT(P) | Pは格納するビット数 |
よく使われるデータ型は、INTEGER、BIGINT、DECIMALです。
INTEGERは、標準的なサイズの整数を表します。
BIGINTは、非常に大きな整数を表します。INTEGERの範囲を超える可能性がある場合に用いられますが、無駄にBIGINTを使用するとインデックスのサイズ増加やキャッシュ効率の低下につながる可能性があります。パフォーマンスを考慮したうえで利用する必要があります。
DECIMALは、正確な固定小数点を表し、浮動小数点の丸め誤差が起きないというメリットを持ちます。一方、FLOATやDOUBLEよりもストレージ効率が悪く、計算速度が遅いというデメリットがあります。そのため、金額など誤差が許されないデータに対して用いられます。
また、MySQLでは数値型は、デフォルトで符号付き数値として扱われるため、負の値(マイナス)も格納できます。
もし、符号なしでデータ型を扱いたい場合は、「UNSIGNED」キーワードを利用します。「UNSIGNED」キーワードを明示した場合、格納できる値はゼロと正の数のみで、負の数は格納できなくなります。
その代わりに、符号付きの場合と比べて約2倍の大きさの正の数を格納可能です。
例えば、通常の「TINYINT」は -128~127を格納しますが、「TINYINT UNSIGNED」 は 0~255 の範囲を格納できます。
| 型名 | バイト数 | 符号付き最大値 | 符号なし(UNSIGNED)最大値 |
|---|---|---|---|
| TINYINT | 1 | 127 | 255 |
| SMALLINT | 2 | 32,767 | 65,535 |
| MEDIUMINT | 3 | 8,388,607 | 16,777,215 |
| INTEGER | 4 | 2,147,483,647 | 4,294,967,295 |
| BIGINT | 8 | $$ 2^{63} - 1 $$ | $$ 2^{64} - 1 $$ |
2. 文字列データ型
| 型名 | 説明 |
|---|---|
| CHAR | 固定長文字列 |
| VARCHAR | 可変長文字列 |
| BINARY | 固定長バイナリ文字列 |
| VARBINARY | 可変長バイナリ文字列 |
| BLOB | 大きなバイナリ文字列 |
| TEXT | 長い文字列 |
| ENUM | 列挙型 |
| SET | 集合 |
よく利用されるデータ型はCHARとVARCHARです。
格納する最大文字数を宣言する点は、どちらも同じです。
2つの違いは、残った領域の扱い方にあります。
CHARは、固定長文字列です。
そのため、指定した最大文字数の長さの領域を常に確保します。
具体的には、最大文字数よりも短い文字数を格納した場合、残りの領域にはスペースが埋められます。値を取り出した際には、通常この末尾のスペースは削除されますが、これはMySQLのSQLモード(PAD_CHAR_TO_FULL_LENGTH)設定に依存します。
利用される領域の長さが一定であるため、処理速度が速くなるという特徴があります。
郵便番号、ハッシュ値など、長さが一定のデータに用います。
一方のVARCHARは、可変長文字列型です。
そのため、実際に格納した文字数分の領域のみを利用します。
容量効率が良いという特徴があります。
名前・住所など長さが変動するデータに用います。
3.日時データ型
| 型名 | 説明 | 表示形式 | 年 | 月日 | 時分秒 | マイクロ秒 |
|---|---|---|---|---|---|---|
| DATETIME | 日付と時刻 | YYYY-MM-DD hh:mm:ss.ffffff |
〇 | 〇 | 〇 | 〇 |
| TIMESTAMP | 日付と時刻 | YYYY-MM-DD hh:mm:ss.ffffff |
〇 | 〇 | 〇 | 〇 |
| DATE | 日付 | YYYY-MM-DD |
〇 | 〇 | - | - |
| TIME | 時刻 | hh:mm:ss.ffffff |
- | - | 〇 | 〇 |
| YEAR | 年 | YYYY |
〇 | - | - | - |
よく用いられるのが、DATETIMEやTIMESTAMPです。
どちらも、日付と時刻を両方格納するデータ型ですが、タイムゾーンの扱いに違いがあります。
DATETIMEは、タイムゾーン情報を持たないため、挿入された日付と時刻を文字列として格納します。
作成日、更新日など、タームゾーン情報が不要な日付と時刻の記録に用いられます。
一方のTIMESTAMPは、タイムゾーンの影響を受けます。そのため、挿入された日付と時刻は、サーバーのタイムゾーンのデータとして解釈されます。値はその後、内部でUTC(協定世界時)に変換されて格納されます。値を取得する際は、設定されているタイムゾーンに変換して、返します。
内部的にはすべての時刻がUTC時刻に統一されているため、国際的なアプリケーションでタイムゾーンを意識した処理が必要な場合に用いられます。
4.BOOLEAN型の扱い方
MySQLには真偽値専用のデータ型がありません。
代わりに、TINYINT(1)を使用します。
TINYINTは、1バイトの非常に小さな整数型です。格納サイズが最小クラスであるため、真偽値などの小さなデータを効率的に格納できます。
データを挿入する際は、真(true)を数値の1に、偽(false)を数値の0として扱います。
また、TINYINTで真偽値を格納する際は、TINYINT(1)のように、表示幅を(1)と指定します。
実は、表示幅の指定(M)は、MySQL 8.0以降非推奨となり、表示幅の指定も無視されるようになりました。
しかし、表示幅の指定(1)は、このカラムが真偽値を格納していることを示す目印として慣習的に指定されてきました。
さらに、TINYINT(1)のシノニムとして、「BOOLEAN」と「BOOL」が定義されています。そのため、「BOOLEAN」と「BOOL」と指定しても問題なく利用できます。
まとめ
-
数値データ型では、INTEGERやBIGINT、正確な固定小数点のDECIMALがよく使われ、必要に応じてUNSIGNEDで符号なし整数を扱えます
-
文字列データ型では、固定長のCHARと可変長のVARCHARがあり、データの長さに応じて使い分けます
-
日時データ型では、タイムゾーン情報を持たないDATETIMEと、内部でUTCに変換されタイムゾーンの影響を受けるTIMESTAMPがあり、用途によって使い分けが必要です
-
BOOLEAN型専用のデータ型はなく、代わりにTINYINT(1)が使用され、BOOLEANやBOOLはTINYINT(1)のシノニムとして利用できます
記事は以上です。
最後までお読みいただき、ありがとうございました。
参考情報一覧
この記事は以下の情報を参考にして執筆しました。
- [MySQL徹底入門 第5版]
- MySQL 8.0 リファレンスマニュアル (参照:2025/12/4)