章: 第1章: 基礎と環境構築
「とりあえずテーブルを作ろう」が後で痛い目を見る理由
DB設計でよくある失敗は、文字コードを指定せずにテーブルを作り、絵文字が入らなかったり日本語が文字化けしたりすること。あるいはカラムの型を雑に決めて、後から ALTER TABLE で大量データを抱えたまま変更しようとして詰まること。
最初の定義が、後のマイグレーションや運用のすべてに影響します。 この記事では CREATE DATABASE と CREATE TABLE の正しい書き方を身につけましょう。
「なんとなく作る」vs「意図を持って設計する」
問題は知識不足よりも「何を決めておくべきか」が見えていないことです。テーブル作成時に意識すべき点は3つに絞れます。
1. 文字コード: utf8mb4 + utf8mb4_unicode_ci で統一する
2. 主キーの型: BIGINT UNSIGNED AUTO_INCREMENT が現代のベストプラクティス
3. NOT NULL制約: 曖昧なNULLを避けてデフォルト値を明示する
良い設計・悪い設計の比較
| 項目 | 悪い例 | 良い例 |
| 文字コード | 未指定(latin1になる場合あり) | utf8mb4 を明示 |
| 主キー型 | INT |
BIGINT UNSIGNED AUTO_INCREMENT |
| 日時カラム | VARCHAR(20) に日付文字列 |
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP |
| NULL許可 | 全カラムにNULL許可 | 必要な列のみNULL許可、他は NOT NULL |
チェックポイント:
utf8mb4は絵文字を含む4バイト文字に対応しています。utf8(3バイト)だと絵文字の保存時にエラーになるため、日本語サービスでは必ずutf8mb4を指定しましょう。
実際のコードのサンプル
CREATE DATABASE blog_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE blog_app;
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
まとめ & 次のステップ
CREATE DATABASEでは文字コード(utf8mb4)と照合順序を必ず指定する- 主キーは
BIGINT UNSIGNED AUTO_INCREMENTが現代のスタンダード NOT NULLを基本とし、NULLを許可する理由を列ごとに説明できる状態を目指すUNIQUE制約はインデックスを自動的に生成するため、重複防止と検索速度向上を兼ねる
次回は 「主キー・外部キーの基本」 を学びます。テーブル間のリレーションを正しく定義して、データの一貫性を守る方法を確認します。