文字セットと照合順序の基礎
MySQL におけるデータ保存および比較処理において、文字セット(Character Set)と照合順序(Collation)の理解は不可欠です。これらの設定不備は、データ破損や文字化けの原因となり得ます。文字セットは字符のエンコーディング方式を定義し、照合順序は字符の比較ルール(大文字小文字の区別など)を決定します。
例えば、字符「A」と「a」が同一として扱われるかどうかは、選択された照合順序に依存します。MySQL ではサーバー、データベース、テーブル、列という 4 つの階層でこれらを個別に定義可能であり、細やかな制御が可能です。
サポートされている設定の確認
システムがサポートする文字セットおよび照合順序の一覧は、以下のクエリで確認できます。
mysql> SHOW CHARACTER SET LIKE 'utf8%';
+---------+---------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+--------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
+---------+---------------+--------------------+--------+
特定の文字セットに対応する照合順序の詳細は、SHOW COLLATION コマンドまたは information_schema.COLLATIONS テーブルを参照することで取得可能です。照合順序の命名規則は、「文字セット名_言語_特性」の形式をとります(例:utf8mb4_unicode_ci)。
サーバーレベルの設定
サーバーレベルの設定は、データベース作成時に明示的な指定がない場合のデフォルト値として機能します。
変数の確認
現在適用されているサーバーレベルの設定は、システム変数を通じて確認します。
mysql> SHOW VARIABLES LIKE 'character_set_server';
mysql> SHOW VARIABLES LIKE 'collation_server';
起動時および設定ファイルによる指定
MySQL サーバー起動時にコマンドライン引数で指定するか、設定ファイル(my.cnf)に記述することで恒久化できます。
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'
コンパイル時にデフォルト値を定義することも可能ですが、通常は設定ファイルによる管理が推奨されます。
データベースレベルの設定
個別のデータベースに対して文字セットを定義するには、作成または変更時に指定を行います。これにより、同一サーバー内でもデータベースごとに異なるエンコーディングを採用できます。
CREATE DATABASE inventory_db
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
既存のデータベース設定を確認するには、以下のいずれかの方法が利用できます。
mysql> USE inventory_db;
mysql> SELECT @@character_set_database, @@collation_database;
-- または information_schema を利用
mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE schema_name = 'inventory_db';
指定がない場合、サーバーレベルの設定が継承されます。
テーブルおよび列レベルの設定
テーブル作成時にも文字セットを指定可能です。列レベルで指定がない場合、テーブルの設定が適用されます。
CREATE TABLE stock_items (
id INT NOT NULL PRIMARY KEY,
product_name VARCHAR(100)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
テーブルの設定確認は、ステータス表示または作成文の表示で行います。
mysql> SHOW TABLE STATUS FROM inventory_db LIKE 'stock_items';
mysql> SHOW CREATE TABLE stock_items;
特定の列のみ異なる文字セットを使用したい場合は、列定義時に明示します。
ALTER TABLE stock_items
ADD COLUMN description TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
列レベルでの指定が優先され、未指定の場合はテーブル、データベース、サーバーの順で上位の設定が継承されます。
設定戦略の推奨
文字セットの構成は、以下の 3 つのタイミングで検討できます。
- データベース作成時:最も柔軟性が高く、アプリケーションごとに最適化できます。
- サーバー起動時:全体的なデフォルトを統一したい場合に有効です。
- ソースコンパイル時:システム全体の基底設定として固定する場合に使用されます。
現代的な運用では、データベース作成時に utf8mb4 を明示的に指定する方法が最も確実です。これにより、サーバーのデフォルト設定に依存せず、絵文字を含むすべての Unicode 字符を正しく扱える環境を構築できます。クライアント接続時の文字セットについては、別途 SET NAMES 等による接続層の設定が必要となります。