12.

MySQL 文字コード確認・設定完全ガイド

編集
この記事の要点
  • サーバ全体: SHOW VARIABLES LIKE "character_set%" / SHOW VARIABLES LIKE "collation%"
  • テーブル別: SHOW CREATE TABLE table_name または information_schema.TABLES
  • カラム別: SHOW FULL COLUMNS FROM table_name
  • 推奨デフォルト: utf8mb4 + utf8mb4_unicode_ci (絵文字対応)
  • utf8 (3バイト) は MySQL 独自で絵文字非対応 → 必ず utf8mb4 (4バイト)
  • 永続化は my.cnf: [mysqld][client] 両方に書く

確認系コマンド

サーバ全体の設定

-- 文字セット
SHOW VARIABLES LIKE 'character_set%';
-- character_set_client       | utf8mb4
-- character_set_connection   | utf8mb4
-- character_set_database     | utf8mb4
-- character_set_filesystem   | binary
-- character_set_results      | utf8mb4
-- character_set_server       | utf8mb4
-- character_set_system       | utf8

-- 照合順序
SHOW VARIABLES LIKE 'collation%';
-- collation_connection | utf8mb4_unicode_ci
-- collation_database   | utf8mb4_unicode_ci
-- collation_server     | utf8mb4_unicode_ci
変数意味
character_set_clientクライアントから来る SQL の文字コード
character_set_connection接続上の文字コード
character_set_database現在の DB のデフォルト
character_set_resultsサーバから返す結果の文字コード
character_set_serverサーバ全体のデフォルト
character_set_systemメタデータ用 (常に utf8 で OK)

データベース単位

SELECT
    SCHEMA_NAME,
    DEFAULT_CHARACTER_SET_NAME,
    DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'mydb';

-- 別の書き方
SHOW CREATE DATABASE mydb;
-- CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */

テーブル単位

-- CREATE TABLE 文ごと表示
SHOW CREATE TABLE users;

-- 一覧で見たい
SELECT
    TABLE_NAME,
    TABLE_COLLATION,
    (SELECT CHARACTER_SET_NAME
     FROM information_schema.COLLATIONS
     WHERE COLLATION_NAME = T.TABLE_COLLATION) AS CHARSET
FROM information_schema.TABLES T
WHERE TABLE_SCHEMA = 'mydb';

カラム単位

-- フル情報表示
SHOW FULL COLUMNS FROM users;
-- Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment

-- information_schema からも
SELECT
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_SET_NAME,
    COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'users';

utf8 と utf8mb4 の違い

項目utf8 (旧)utf8mb4 (推奨)
正体MySQL 独自の 3 バイト UTF-8RFC 準拠の 4 バイト UTF-8
絵文字NG (4 バイト文字)OK
VARCHAR(255) のバイト数765 B1020 B
InnoDB の最大インデックス影響薄3072 B 制限 (古い設定だと 767 B → 191 文字)
MySQL 8.0 のデフォルトutf8mb4_0900_ai_ci

絶対に utf8mb4 を使ってください。古い記事の CHARSET=utf8 はそのまま流用しないこと。

my.cnf での設定

# /etc/mysql/my.cnf or /etc/my.cnf

[mysqld]
character-set-server = utf8mb4
collation-server     = utf8mb4_unicode_ci
init-connect         = 'SET NAMES utf8mb4'
skip-character-set-client-handshake

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqldump]
default-character-set = utf8mb4

反映:

sudo systemctl restart mysql       # or mysqld
mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%'"

ALTER で既存 DB / テーブル / カラムを変換

-- データベース全体
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- テーブル + 全カラム一括 (★ CONVERT TO がポイント)
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- テーブルのデフォルトだけ変える (既存カラムは変わらない)
ALTER TABLE users DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 特定カラムだけ
ALTER TABLE users
    MODIFY name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意: 既にデータが入っていて誤った文字コードで保存された (例: 化けた状態のバイトを utf8 として読んでいる) 場合は、CONVERT で再エンコードされて更に化けることがあります。事前にダンプを取得し、テスト DB で検証してください。

接続単位での確認・変更

-- 現在の接続だけ変更
SET NAMES utf8mb4;
-- これは
--   SET character_set_client     = utf8mb4;
--   SET character_set_connection = utf8mb4;
--   SET character_set_results    = utf8mb4;
-- の 3 つをまとめて実行

-- 個別に
SET character_set_results = utf8mb4;

文字化けの典型パターン

症状原因対処
表示が ??? になるcharacter_set_results = latin1SET NAMES utf8mb4
表示が縺セ縺ソ... (二重エンコード)utf8 → cp932 → utf8 と通ったダンプを binary でやり直し、正しい charset で取り込み
絵文字を入れると Incorrect string valueカラムが utf8 (3バイト)utf8mb4 に変換
JOIN が Illegal mix of collations異なる照合順序のカラム比較双方を同じ collation に揃える

FAQ

Q: collation はどれを選ぶ?
A: 日本語混在なら utf8mb4_unicode_ci または MySQL 8 の utf8mb4_0900_ai_ci (新規)。大小区別したいなら _bin 系。

Q: 既存 DB が utf8 で困っている
A: ダンプ → 新規 DB を utf8mb4 で作成 → 取り込み。本番ではメンテ時間を取って実施。

Q: クライアントだけ utf8mb4 にしても化ける
A: サーバ / DB / テーブル / カラム / 接続 の5 層すべて utf8mb4 で揃える必要があります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. 実行計画の表示方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法
  25. MySQLで文字列の置換をする方法