データ型の選び方
このレッスンで分かること
- データ型は数値・文字列・日付・その他の 4 カテゴリで整理して選びます
- 金額は必ず
DECIMAL(全体, 小数)、FLOATは誤差で詰みます- 大規模 ID は最初から
BIGINT、文字列は用途別にCHAR/VARCHAR/TEXT
データ型の選び方 とは
SQLにおける適切なデータ型の選択方法を、具体的な例を交えながらSQLで実践的に解説します。本レッスンでは、データ型の選び方 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
CREATE TABLE で列を定義するとき、必ず型を指定します。型は「その列にどんな値を入れられるか」を決めるルールであると同時に、後から効いてくるストレージ容量・検索速度・並び順・四捨五入の挙動まで全部を支配する設計上の要です。「とりあえず VARCHAR(255) でいいや」と置いた結果、数値演算で文字列ソートになってバグった、というのは典型的な事故です。本レッスンではよく使う型をカテゴリ別に整理して、「どんなときにどれを選べばよいか」を判断できる状態を目指します。
型を選ぶときに常に意識したいのは、「アプリでこの値をどう使うか」です。集計するなら数値、表示するだけなら文字列、ソートして範囲検索するなら日付、というふうに用途から逆算して型を決めます。
型の 4 カテゴリ
大きく分けると数値型、文字列型、日付型、その他 (真偽値・JSON 等) の 4 つです。
主要型の使い分けを表で整理すると、次のとおりです。
| カテゴリ | 型 | 用途 | 例 |
|---|---|---|---|
| 数値 | INT | 一般的な整数 | カウント、年齢 |
| 数値 | BIGINT | 大規模 ID | ユーザ ID、注文 ID |
| 数値 | DECIMAL(10,2) | 金額・税率 | 価格、税率 |
| 文字列 | CHAR(n) | 固定長コード | 国コード、性別 |
| 文字列 | VARCHAR(n) | 可変長文字列 | 名前、メール |
| 文字列 | TEXT | 長文 | 本文、記事 |
| 日付 | DATE | 日付のみ | 誕生日 |
| 日付 | TIMESTAMP | 日付+時刻 | 行動ログ |
| その他 | BOOLEAN | 真偽値 | フラグ |
| その他 | JSON | 半構造化 | 設定値 |
数値型
SQL クエリ
CREATE TABLE numbers_demo (
small_count INT, -- -2147483648 〜 2147483647
huge_count BIGINT, -- 64 bit、ユーザ ID 等で
price DECIMAL(10, 2) -- 金額は小数を厳密に扱う
);金額・税率・在庫数のように「四捨五入で 1 円ずれたら困る」値は DECIMAL(全体桁, 小数桁) を使います。FLOAT / DOUBLE は速度重視の物理量向けで、金額に使ってはいけません。
ユーザ ID や注文 ID のように単調増加するキーは、INT (約 21 億の上限) では成長中のサービスで溢れることがあります。最初から BIGINT にしておくのが定石です。
文字列型
SQL クエリ
CREATE TABLE strings_demo (
country_code CHAR(2), -- 必ず 2 文字
display_name VARCHAR(100), -- 可変、最大 100 文字
description TEXT -- 長文 本文や記事
);- CHAR(n) — 常に n 文字に詰めて保存。短くて長さが完全に決まっているもの (国コード、性別コード) に向く
- VARCHAR(n) — 実際の長さだけ保存。名前・URL・短いコメントに向く
- TEXT — 本文・記事のような長文。インデックスは前方一致のみ
日付・時刻型
SQL クエリ
CREATE TABLE dates_demo (
birth_date DATE, -- 日付のみ 1990-04-01
signed_at TIMESTAMP, -- 日付+時刻 1990-04-01 09:30:00
updated_at TIMESTAMP -- TIMESTAMP に近いが UTC で保存されタイムゾーン変換される
);誕生日のように時刻が要らないなら DATE、ユーザの行動ログのように UTC で持ちたい列は TIMESTAMP が便利です。日本のサービスでも内部では UTC、表示時に JST、というのが現代の定石です。
金額は DECIMAL、ID は INT/BIGINT、本文は TEXT、コードは CHAR(n)、フラグは BOOLEAN (TINYINT(1)) というルールを最初に決めると、テーブル間で型が揃いません。プロジェクト最初の段階で「型ガイドライン」を 1 ページにまとめておくと、レビューもセルフチェックも一気に楽になります。
VARCHAR(n) の n は「アプリ側の制約値」を素直に置きます。メールアドレスなら 255、URL なら 1000、SNS の表示名なら 50、というふうに値の用途から決めます。「とりあえず VARCHAR(255)」は思考停止のサインです。
注意 古いプロジェクトでよく見る「金額を FLOAT で保存」は本当に詰みます。0.1 + 0.2 が 0.3 にならない世界が始まるので、必ず DECIMAL を使ってください。
代表例 — ユーザテーブルの型設計
SQL クエリ
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
name VARCHAR(100) NOT NULL,
age INT,
balance DECIMAL(10, 2) NOT NULL,
is_active BOOLEAN NOT NULL,
joined_at TIMESTAMP NOT NULL
);それぞれ「なぜその型か」を説明できれば設計レビューでも自信を持って通せます。
ここまでの要点
型は「用途から逆算」で決める。金額は DECIMAL、大規模 ID は BIGINT、文字列は用途別 (CHAR / VARCHAR / TEXT)、日付は DATE / TIMESTAMP。FLOAT を金額に使うのは禁止。
まとめ
- 数値は INT / BIGINT / DECIMAL を使い分ける。金額は必ず DECIMAL
- 文字列は CHAR / VARCHAR / TEXT を、長さと検索方法で選ぶ
- 日付は DATE / TIMESTAMP / TIMESTAMP を時刻の有無とタイムゾーン要件で選ぶ
- 「とりあえず VARCHAR(255)」は卒業し、要件から型を決める習慣をつける
次のレッスン
次は INSERT 文でデータを追加する です。SQLのINSERT文を使ったテーブルへのデータ追加方法を、実際にSQLを操作しながら実践的に習得します。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- データ型 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. データ型 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
テーブル構造
schema.sql
SELECT 1;期待される出力
| column_name | data_type |
|---|---|
| id | bigint |
| character varying | |
| country_code | character |
| age | integer |
| balance | numeric |
| joined_at | timestamp without time zone |