MySQLにおける文字セットと照合順序の実践的設定ガイド

MySQLの文字処理は、CHARACTER SET(文字セット)とCOLLATION(照合順序)という二つの密接に関連する概念によって制御されます。これらを正しく理解・設定しないと、文字化け、検索結果の不整合、ソート順の予期せぬ変化、インデックス効率の低下など、アプリケーション全体に影響を及ぼす問題が発生します。

サーバー全体の文字エンコーディングを統一する

MySQL 8.0以降では、推奨される基盤文字セットはutf8mb4です。これはUTF-8の完全実装であり、絵文字(Emoji)、漢字拡張、サムスン文字など、4バイト長のUnicode文字を安全に格納できます。従来のutf8(実際にはutf8mb3)は最大3バイトまでしか対応しないため、現代的なWebアプリケーションでは非推奨です。

サーバーのデフォルト文字セットをutf8mb4に固定するには、構成ファイル(例:/etc/my.cnfまたは/usr/local/etc/my.cnf)に以下のセクションを追加します:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

この設定により、以下の5つの重要なシステム変数が自動的にutf8mb4に揃えられます:

  • character_set_client:クライアントから送信されたクエリの解釈に使用
  • character_set_connection:クエリ解析時の内部変換用
  • character_set_results:クエリ結果のエンコーディング形式
  • character_set_server:新規データベース作成時のデフォルト
  • character_set_database:現在のデフォルトDBの文字セット(動的)

確認コマンド:

SELECT VARIABLE_NAME, VARIABLE_VALUE 
FROM performance_schema.global_variables 
WHERE VARIABLE_NAME REGEXP '^character_set_(client|connection|results|server|database)$';

照合順序(Collation)の選択と意味

COLLATIONは、文字列の比較・並べ替え・等価判定の振る舞いを定義します。たとえば、'A' = 'a'TRUEになるか、'café' < 'cafe'がどう評価されるかは、照合順序に依存します。

MySQL 8.0のデフォルトはutf8mb4_0900_ai_ciです。各要素の意味は次の通りです:

  • utf8mb4:文字セット名
  • 0900:Unicode Collation Algorithm (UCA) のバージョン(v9.0.0)
  • ai:accent-insensitive(アクセント無視:é, è, ê はすべて e と同等)
  • ci:case-insensitive(大文字小文字無視)

代替候補としてよく使われる照合順序:

照合順序特徴用途例
utf8mb4_unicode_ciUCA v4.0準拠、多言語対応が堅牢国際化アプリケーション向け
utf8mb4_0900_as_csアクセント・大文字小文字ともに区別パスワードハッシュやトークン比較など厳密な一致が必要な場面
utf8mb4_binバイナリ比較(ASCII値順)性能重視かつ厳密なバイト単位比較が必要な場合

文字セットと照合順序の適用レベルと優先順位

MySQLでは、以下の5つのレベルで文字セット/照合順序を指定でき、明示的に上書きされない限り、下位レベルは上位レベルの設定を継承します:

  1. サーバー(インスタンス)レベルmy.cnfでのcharacter-set-servercollation-server
  2. データベース(スキーマ)レベルCREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
  3. テーブルレベルCREATE TABLE t1 (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  4. カラムレベルname VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
  5. クエリレベル(実行時)SELECT * FROM users ORDER BY name COLLATE utf8mb4_bin;

優先順位は「クエリ>カラム>テーブル>データベース>サーバー」です。つまり、特定のカラムにCOLLATE utf8mb4_binを指定すれば、そのカラムに対するすべての比較・ソート操作がバイナリ比較になります。

既存オブジェクトへの変更手法

運用中のデータベースに対して、安全に文字セットをアップグレードするためのSQL例を以下に示します。

■ データベース全体のデフォルトを変更(スキーマ定義のみ更新):

ALTER DATABASE app_db 
  DEFAULT CHARACTER SET utf8mb4 
  COLLATE utf8mb4_0900_ai_ci;

■ テーブルの全文字列カラムを含むエンコーディングを変換(データ変換あり):

ALTER TABLE user_profiles 
  CONVERT TO CHARACTER SET utf8mb4 
  COLLATE utf8mb4_0900_ai_ci;

■ 特定カラムだけを再定義(型を保持しつつ照合順序のみ変更):

ALTER TABLE products 
  MODIFY COLUMN description TEXT 
    CHARACTER SET utf8mb4 
    COLLATE utf8mb4_unicode_ci;

■ インデックス付きカラムの変更時は、事前にインデックス削除→カラム変更→再作成を推奨(大規模テーブルではオンラインDDLを活用)。

診断と検証のための有用なクエリ

文字セット関連の設定状態を即座に確認するための代表的なクエリ:

-- 現在の接続で有効な文字セットと照合順序
SELECT @@character_set_client, @@collation_connection;

-- 指定データベースの作成文(エンコーディング情報が含まれる)
SHOW CREATE DATABASE app_db;

-- テーブル構造と各カラムの照合順序
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'app_db' AND TABLE_NAME = 'users';

-- サポートされている照合順序一覧(utf8mb4限定)
SELECT COLLATION_NAME, IS_DEFAULT 
FROM information_schema.COLLATIONS 
WHERE COLLATION_NAME LIKE 'utf8mb4%';

これらの設定は、アプリケーションのローカライズ対応、検索精度、およびデータ整合性の根幹を支えるものです。特に多言語対応やユーザー生成コンテンツ(UGC)を扱うシステムでは、初期設計段階でutf8mb4utf8mb4_0900_ai_ciを標準とすることが強く推奨されます。

タグ: MySQL utf8mb4 collation character-set Unicode

7月17日 22:37 投稿