| この記事の要点 |
|
MySQL / MariaDB のデータ型とは
テーブルを作るとき、各カラムには「どんな種類の値を、どれくらいの大きさまで入れるか」を表すデータ型を指定します。データ型を適切に選ぶと、ストレージの節約、検索の高速化、不正な値の混入防止につながります。逆に、何でも VARCHAR(255) にしたり、金額を FLOAT にしたりすると、後から並び順がおかしい・合計が合わないといった不具合の原因になります。
MySQL と MariaDB は共通の祖先を持つため、基本的なデータ型はほぼ同じです。以下は 2026 年時点の MySQL 8.x / MariaDB 10.x〜11.x を前提にしています。
主要なデータ型一覧(早見表)
| 分類 | データ型 | 内容・範囲 | 主な用途 |
|---|---|---|---|
| 整数 | TINYINT | 1 バイト。-128〜127(UNSIGNED で 0〜255) | フラグ、小さな区分値 |
| 整数 | SMALLINT | 2 バイト。-32768〜32767(UNSIGNED で 0〜65535) | 件数の少ないマスタの ID |
| 整数 | MEDIUMINT | 3 バイト。-8388608〜8388607 | 中規模の数値 |
| 整数 | INT | 4 バイト。約 -21 億〜21 億(UNSIGNED で 0〜約 42 億) | 一般的な ID、数量 |
| 整数 | BIGINT | 8 バイト。約 ±922 京 | 大量データの ID、ミリ秒の時刻値 |
| 固定小数点 | DECIMAL(M,D) | 全体 M 桁(最大 65)、小数部 D 桁(最大 30)を正確に保持 | 金額、税率 |
| 浮動小数点 | FLOAT / DOUBLE | 4 バイト / 8 バイトの近似値 | 測定値、座標、統計 |
| 文字列 | CHAR(M) | 固定長。最大 255 文字。短い値は末尾を空白で埋めて保存 | 都道府県コードなど長さが一定の値 |
| 文字列 | VARCHAR(M) | 可変長。最大 65,535 バイト(行全体の上限と共有) | 名前、メールアドレス、タイトル |
| 文字列 | TEXT 系 | TINYTEXT(255 バイト)/ TEXT(約 64KB)/ MEDIUMTEXT(約 16MB)/ LONGTEXT(約 4GB) | 本文、ログ |
| 日付 | DATE | YYYY-MM-DD。1000-01-01〜9999-12-31 | 誕生日、締め日 |
| 時刻 | TIME | HH:MM:SS。-838:59:59〜838:59:59 | 時刻、経過時間 |
| 日時 | DATETIME | YYYY-MM-DD HH:MM:SS。1000 年〜9999 年 | 予約日時、イベント日時 |
| 日時 | TIMESTAMP | UTC で保存。1970-01-01 00:00:01〜2038-01-19 03:14:07(UTC) | 作成日時、更新日時 |
| 年 | YEAR | YYYY。1901〜2155 | 年度 |
| 列挙 | ENUM / SET | 定義した候補から 1 つ(ENUM)または複数(SET) | 状態、区分 |
| バイナリ | BINARY / VARBINARY / BLOB 系 | 文字コードを持たないバイト列 | ハッシュ値、UUID のバイナリ表現 |
| JSON | JSON | MySQL は専用のバイナリ形式で保存。MariaDB では LONGTEXT の別名(JSON 妥当性チェック付き) | 可変な属性、設定値 |
数値型の選び方
整数型と UNSIGNED
数値のデータ型の後に UNSIGNED を付けると負の数を格納できなくなり、その分だけ正の数の上限が約 2 倍に広がります。たとえば INT は最大 2,147,483,647 ですが、INT UNSIGNED なら 4,294,967,295 まで入ります。ID や個数など負にならない値に向いています。
ただし UNSIGNED 同士の引き算で結果が負になるとエラー(BIGINT UNSIGNED value is out of range)になる点には注意が必要です。また MySQL 8.0.17 以降、FLOAT / DOUBLE / DECIMAL に対する UNSIGNED は非推奨になっています。
CREATE TABLE products (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
stock SMALLINT UNSIGNED NOT NULL DEFAULT 0,
price DECIMAL(10,2) NOT NULL, -- 金額は DECIMAL
weight_kg DOUBLE NULL, -- 近似値で良い測定値
is_active TINYINT(1) NOT NULL DEFAULT 1 -- BOOLEAN は TINYINT(1) の別名
);
DECIMAL と FLOAT / DOUBLE の違い
FLOAT / DOUBLE は 2 進数の近似値なので、0.1 のような値を正確に表せません。合計や等価比較で 0.30000000000000004 のような誤差が出ることがあります。金額・ポイント・税率のように 1 円のずれも許されない値は DECIMAL を使います。
文字列型の選び方
- VARCHAR(M) の M は文字数です。utf8mb4(絵文字も保存できる 4 バイト文字コード)では 1 文字最大 4 バイトなので、VARCHAR の実質的な上限は約 16,000 文字になります
- CHAR は長さが常に一定の値に使います。可変長の値に CHAR を使うと末尾の空白が取り除かれて返るため、意図しない比較結果になることがあります
- TEXT 系はインデックスを張るときにプレフィックス長(先頭何文字か)の指定が必要です。検索や並び替えに使うカラムは VARCHAR が扱いやすいです
- 文字コードと照合順序(collation)によって大文字・小文字や全角・半角の区別が変わります。比較結果が想定と違う場合はテーブルの照合順序を確認します
日付・時刻型:DATETIME と TIMESTAMP の違い
| 項目 | DATETIME | TIMESTAMP |
|---|---|---|
| 保存方法 | 入力値をそのまま保存 | UTC に変換して保存し、取得時にセッションのタイムゾーンへ戻す |
| 範囲 | 1000 年〜9999 年 | 1970 年〜2038 年 1 月 19 日(UTC) |
| 向いている用途 | 予約日時など「その地域の時刻」として意味がある値 | レコードの作成・更新日時など「ある瞬間」を表す値 |
TIMESTAMP は 2038 年 1 月 19 日を超える値を保存できません(いわゆる 2038 年問題)。有効期限や長期の予定など将来の日時を扱うカラムは DATETIME を選びます。どちらも DATETIME(3) のように指定すると小数秒(最大 6 桁、マイクロ秒)まで保存できます。
INT(10) の数字は何を意味するか
INT(10) の (10) は「表示幅」で、格納できる桁数や範囲には影響しません。INT(1) でも INT(11) でも保存できる値は同じです。この表示幅は ZEROFILL(ゼロ埋め表示)と組み合わせたときにしか意味がなく、MySQL 8.0.17 以降は TINYINT(1) を除いて非推奨となり、SHOW CREATE TABLE でも表示されなくなりました。新しく書く DDL では INT とだけ書けば十分です。
よくある落とし穴
- 範囲外の値: 厳格モード(STRICT_TRANS_TABLES、MySQL 5.7 以降の既定)では範囲外の値はエラーになります。厳格モードを外した環境では最大値に丸められて黙って保存されるため、環境によって挙動が違います
- 電話番号や郵便番号を INT にする: 先頭の 0 が消えます。計算しない番号は VARCHAR に入れます
- ENUM の候補追加: 候補の追加は ALTER TABLE が必要です。頻繁に増える区分は別テーブル(マスタ)にした方が運用しやすくなります
- JSON 型の互換性: MySQL と MariaDB で内部の扱いが異なります。両方で動かす前提なら JSON 関数の挙動を事前に確認します
データ型の確認方法
既存テーブルのカラムの型は次のコマンドで確認できます。
-- カラム一覧と型
DESC products;
-- テーブル定義をそのまま表示
SHOW CREATE TABLE products\G
-- 特定スキーマの全カラムの型を一覧
SELECT table_name, column_name, column_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'mydb'
ORDER BY table_name, ordinal_position;
関連
- MariaDB のデータ型とカラム修飾子
- SQL CREATE TABLE 完全ガイド — テーブル作成と制約
- MySQL AUTO_INCREMENT 完全ガイド (ロック/ギャップ/リセット)
- テーブル定義を確認する SQL コマンド (DESC / SHOW FULL COLUMNS)
- Java データ型完全ガイド — プリミティブと参照型
子ページはありません
- ダウンロード&インストール方法(Windows)
- インストール方法(Linux)
- コマンド一覧
- SQL
- データ型
- 関数
- 管理ツール
- 設定
- パフォーマンスチューニング関連
- エクスポートおよびインポート
- エラー&トラブル
- 文字コードの確認
- 実行中の SQL の状態確認およびプロセスキルの方法
- パスワードの無効化設定
- root ユーザーの初期パスワード確認方法
- rootユーザーのパスワード変更方法
- LIMIT, OFFSET の始まりと挙動
- mysqlのバージョン確認方法
- MySQLで実行計画を表示する方法
- レプリケーションのステータス確認方法
- 中央値の導き方(バージョン8未満)
- 階層SQL(バージョン8未満)
- パーセンタイルの導き方
- 特定スキーマの全テーブルの全カラム情報を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38