データ型の選び方

このレッスンで分かること

  • データ型は数値・文字列・日付・その他の 4 カテゴリで整理して選びます
  • 金額は必ず DECIMAL(全体, 小数)FLOAT は誤差で詰みます
  • 大規模 ID は最初から BIGINT、文字列は用途別に CHAR / VARCHAR / TEXT

データ型の選び方 とは

SQLにおける適切なデータ型の選択方法を、具体的な例を交えながらSQLで実践的に解説します。本レッスンでは、データ型の選び方 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

CREATE TABLE で列を定義するとき、必ず型を指定します。型は「その列にどんな値を入れられるか」を決めるルールであると同時に、後から効いてくるストレージ容量・検索速度・並び順・四捨五入の挙動まで全部を支配する設計上の要です。「とりあえず VARCHAR(255) でいいや」と置いた結果、数値演算で文字列ソートになってバグった、というのは典型的な事故です。本レッスンではよく使う型をカテゴリ別に整理して、「どんなときにどれを選べばよいか」を判断できる状態を目指します。

型を選ぶときに常に意識したいのは、「アプリでこの値をどう使うか」です。集計するなら数値、表示するだけなら文字列、ソートして範囲検索するなら日付、というふうに用途から逆算して型を決めます。

型の 4 カテゴリ

大きく分けると数値型、文字列型、日付型、その他 (真偽値・JSON 等) の 4 つです。

diagram (will load when visible)

主要型の使い分けを表で整理すると、次のとおりです。

カテゴリ用途
数値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 / TIMESTAMPFLOAT を金額に使うのは禁止。

まとめ

  • 数値は INT / BIGINT / DECIMAL を使い分ける。金額は必ず DECIMAL
  • 文字列は CHAR / VARCHAR / TEXT を、長さと検索方法で選ぶ
  • 日付は DATE / TIMESTAMP / TIMESTAMP を時刻の有無とタイムゾーン要件で選ぶ
  • 「とりあえず VARCHAR(255)」は卒業し、要件から型を決める習慣をつける

次のレッスン

次は INSERT 文でデータを追加する です。SQLのINSERT文を使ったテーブルへのデータ追加方法を、実際にSQLを操作しながら実践的に習得します。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. データ型 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. データ型 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

SELECT 1;

期待される出力

column_namedata_type
idbigint
emailcharacter varying
country_codecharacter
ageinteger
balancenumeric
joined_attimestamp without time zone

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...