章: 第5章: 設計品質を上げる
「なぜ文字化けが直らないのか?」と悩んでいませんか?
日本語を扱うアプリを作っていると、突然文字化けが発生したり、大文字・小文字の比較が意図通りに動かなかったりする場面があります。原因は多くの場合、文字コードと照合順序の設定が統一されていないことにあります。
後から修正しようとすると、既存データの変換・アプリ側の修正・テストをすべてやり直す必要が出てきます。設計の最初に正しく統一しておくことが、最も低コストな解決策です。
文字コードと照合順序とは何か?
文字コード(CHARACTER SET) は「どの文字を扱えるか」を決める規則です。MySQLで日本語を安全に扱うには utf8mb4 が必須です(utf8 は絵文字に対応していないため不十分です)。
照合順序(COLLATION) は「文字をどう比較・並び替えるか」を決める規則です。utf8mb4_unicode_ci は大文字・小文字を区別しない比較を行います。
両者がデータベース・テーブル・カラム・接続の各レベルで一致していないと、文字化けや比較不整合が発生します。
| 設定レベル | 確認コマンド | 推奨値 |
| データベース | SHOW CREATE DATABASE db名; |
utf8mb4 / utf8mb4_unicode_ci |
| テーブル | SHOW CREATE TABLE テーブル名; |
utf8mb4 / utf8mb4_unicode_ci |
| カラム | SHOW FULL COLUMNS FROM テーブル名; |
utf8mb4 / utf8mb4_unicode_ci |
| 接続 | SHOW VARIABLES LIKE 'character_set_%'; |
utf8mb4 |
チェックポイント:
utf8とutf8mb4は別物です。日本語サービスでは必ずutf8mb4に統一し、SHOW FULL COLUMNS FROM テーブル名;で各カラムの照合順序が揃っているかを確認してください。
実際のコードサンプル
SHOW CREATE DATABASE blog_app;
SHOW FULL COLUMNS FROM users;
ALTER TABLE users
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
まとめ & 次のステップ
utf8mb4+utf8mb4_unicode_ciをプロジェクト開始時に全レベルで統一するSHOW FULL COLUMNS FROM テーブル名;で現状の設定を必ず確認する- 既存テーブルの変換は
CONVERT TO CHARACTER SETで行い、変換後はデータを目視確認する - 接続文字コードもアプリ側(DSN や
SET NAMES)で合わせることを忘れない - 設計段階でルールをドキュメントに残すと、チーム全体での一貫性が保ちやすくなる
次回は NULL設計とデフォルト値 を学びます。「NULLを許可すべきか」の判断基準を整理し、アプリ側の分岐をシンプルに保つ設計術を解説します。