この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:atom
更新日時:2026-06-11 07:12:00

タイトル: 文字コードの確認
SEOタイトル: 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 で揃える必要があります。