SQLでテーブルを作成するとき、こんな記述を見たことがあるかもしれません:
CREATE TABLE users (
id INT,
name VARCHAR(50),
created_at DATE
);
この「INT
」「VARCHAR(50)
」「DATE
」の部分が、SQLにおける「データ型」です。
データ型は、「このカラムにはどんな種類のデータが入るか」を決める非常に重要な設定です。
誤ったデータ型を使うと、検索や計算が正しくできなかったり、パフォーマンスに悪影響が出たりすることも…。
この記事では、SQL初心者向けに主要なデータ型の種類・用途・注意点をわかりやすくまとめます。
「これからテーブル設計を始めたい」「データ型の違いがよくわからない」という方におすすめです!
データ型とは何か?SQLでの役割

データ型の基本的な目的
データ型は、データベースで以下の役割を果たします:
- データの種類を明確化 数値なのか、文字列なのか、日付なのかを区別します
- 無効な値を防ぐ 「誕生日」カラムに文字列が入らないように制限をかけます
- パフォーマンスの最適化 適切な型で効率的な検索や保存を実現します
- メモリ使用量の最適化 必要最小限のメモリでデータを保存します
なぜデータ型が重要なのか?
例えば、年齢を文字列型で保存すると:
- 「30歳以上」の検索ができない
- 平均年齢の計算ができない
- ソート順がおかしくなる(”9″ > “10”になってしまう)
ポイント: データ型は「どんなデータが入るか」をルールとして定めるもの。
数値型(INT・FLOAT・DECIMALなど)
INT(整数型)
age INT,
quantity INT,
user_id INT
使用場面: 年齢、個数、IDなど小数点のない数値
特徴:
- 範囲:約-21億〜+21億
- メモリ効率が良い
- 計算が高速
BIGINT(大きな整数)
user_count BIGINT,
total_sales BIGINT
使用場面: INTでは足りない大きな数値
特徴:
- 範囲:約-922京〜+922京
- INTより多くのメモリを使用
FLOAT / DOUBLE(浮動小数点数)
temperature FLOAT,
distance DOUBLE
使用場面: 科学計算、測定値など
注意点: 金額計算には不向き(誤差が生じる可能性)
例:
-- 0.1 + 0.2 が 0.3 にならない場合がある
SELECT 0.1 + 0.2; -- 結果: 0.30000000000000004
DECIMAL(p, s)(固定小数点数)
price DECIMAL(10, 2), -- 最大8桁.小数点以下2桁
salary DECIMAL(8, 0) -- 整数8桁
使用場面: 金額、正確な計算が必要な数値
特徴:
- 誤差が生じない
- p:全体の桁数、s:小数点以下の桁数
覚えておこう: 整数はINT
、金額など精度が大事な場合はDECIMAL
がベスト。
文字列型(CHAR・VARCHAR・TEXTなど)

CHAR(n)(固定長文字列)
country_code CHAR(2), -- "JP", "US"など
postal_code CHAR(7) -- "1234567"
使用場面: 文字数が決まっているデータ
特徴:
- 常にn文字で固定(足りない場合はスペースで埋める)
- 検索が高速
- メモリを無駄に使う可能性
VARCHAR(n)(可変長文字列)
name VARCHAR(50),
email VARCHAR(100),
address VARCHAR(200)
使用場面: 一般的な文字列データ
特徴:
- 最大n文字まで保存可能
- 実際の文字数分だけメモリを使用
- 最も よく使われる型
TEXT(長文)
description TEXT,
blog_content TEXT,
notes TEXT
使用場面: ブログ記事、商品説明、備考欄など
注意点:
- データベースによってはインデックスが制限される
- 大量のデータがある場合はパフォーマンスに影響
テクニック: 短文ならVARCHAR
、長文や自由記述欄にはTEXT
。桁数が決まっているならCHAR
も選択肢です。
日付・時間型(DATE・DATETIME・TIMESTAMPなど)
DATE(年月日)
birth_date DATE,
registration_date DATE
形式: YYYY-MM-DD
(例:2024-12-25)
使用場面: 誕生日、登録日など時間が不要な日付
DATETIME(年月日時分秒)
created_at DATETIME,
updated_at DATETIME
形式: YYYY-MM-DD HH:MM:SS
(例:2024-12-25 14:30:00)
使用場面: 作成日時、更新日時など正確な時刻が必要な場合
TIME(時分秒)
opening_time TIME,
work_hours TIME
形式: HH:MM:SS
(例:09:30:00)
使用場面: 営業時間、作業時間など
TIMESTAMP(タイムスタンプ)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
特徴:
- DATETIMEと似ているが、タイムゾーンを考慮
- デフォルトで現在時刻を自動設定可能
- 自動更新機能あり
実用例:
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
覚えておこう: 日付だけならDATE
、時間も必要ならDATETIME
。自動記録ならTIMESTAMP
が便利です。
その他のデータ型(BOOLEAN・BLOBなど)

BOOLEAN(真偽値)
is_active BOOLEAN,
is_deleted BOOLEAN,
is_published BOOLEAN
値: TRUE
(1) / FALSE
(0)
使用場面: フラグ、状態管理
実用例:
-- アクティブなユーザーのみを取得
SELECT * FROM users WHERE is_active = TRUE;
BLOB(バイナリラージオブジェクト)
profile_image BLOB,
document_file BLOB
使用場面: 画像、PDF、音声ファイルなど
注意点:
- データベースのサイズが大きくなる
- バックアップ時間が長くなる
- 通常はファイルサーバーを使うことが推奨される
JSON型(MySQL 5.7以降、PostgreSQL 9.2以降)
user_preferences JSON,
product_attributes JSON
使用場面: 柔軟な構造のデータ
実用例:
INSERT INTO users (name, preferences)
VALUES ('田中', '{"theme": "dark", "language": "ja"}');
まとめ: フラグにはBOOLEAN
、ファイルを保存したいときはBLOB
。ただし用途に注意が必要です。
データ型を選ぶときのコツと注意点
選び方のポイント
データの性質をよく考える
- 金額 →
DECIMAL
- 名前 →
VARCHAR
- 登録日 →
DATE
またはTIMESTAMP
適切なサイズを選ぶ
- 不要に大きな型を使わない
- 将来の拡張も考慮する
NULL値を許可するかを決める
CREATE TABLE users (
id INT NOT NULL, -- 必須項目
name VARCHAR(50) NOT NULL, -- 必須項目
phone VARCHAR(15) -- 任意項目(NULLを許可)
);
よくあるミスと対策
ミスの例 | 問題点 | 正しい選択 |
---|---|---|
金額にFLOATを使う | 計算誤差が出る | DECIMAL(10,2) |
生年月日にVARCHAR | ソート・比較ができない | DATE |
全項目にTEXTを使う | メモリ無駄遣い、性能低下 | 適切なサイズのVARCHAR |
IDにVARCHAR | 数値計算ができない | INT AUTO_INCREMENT |
パフォーマンスを考慮した設計
インデックスを考慮する
-- 検索によく使うカラムは適切な型を選ぶ
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(order_date);
メモリ使用量を最適化する
-- 良い例:必要最小限のサイズ
name VARCHAR(50),
age TINYINT, -- 0-255(年齢には十分)
status CHAR(1) -- 'A'ctive, 'I'nactive
-- 悪い例:過剰なサイズ
name VARCHAR(1000),
age BIGINT,
status VARCHAR(255)
実践的なテーブル設計例

ユーザー管理テーブル
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
birth_date DATE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
商品管理テーブル
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
stock_quantity INT DEFAULT 0,
category_id INT,
is_available BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
よくある質問と答え
Q: VARCHARの長さはどう決めればいいですか?
A: 実際のデータを調査して、最大値の1.2〜1.5倍程度を目安にしましょう。
Q: NULLを許可するかどうかの判断基準は?
A: ビジネス上必須のデータかどうかで判断します。必須ならNOT NULL
を設定しましょう。
Q: INTとBIGINTはどう使い分けますか?
A: 一般的なIDや数量ならINT
で十分です。将来21億を超える可能性がある場合のみBIGINT
を使用しましょう。
まとめ:SQLのデータ型を理解して、設計ミスを防ごう!
重要ポイントまとめ:
- データ型は「何が入るか」を定義する重要な情報
- 数値・文字列・日付・論理値など、目的に合った型を選ぼう
- 間違った型は、検索・計算・パフォーマンスに悪影響
- 将来の拡張性も考慮した設計が大切
コメント