第21回: 文字コードと照合順序 — 文字化けを根本から防ぐ統一戦略

章: 第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

チェックポイント: utf8utf8mb4 は別物です。日本語サービスでは必ず 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を許可すべきか」の判断基準を整理し、アプリ側の分岐をシンプルに保つ設計術を解説します。

Related Articles