2026年6月25日
2026年6月25日
WordPressのデータベースの文字コードをUTF-8に統一する方法
はじめに
WordPressがutf8(3バイト)で作成されたDBに絵文字を保存しようとすると文字化けが発生します。utf8mb4(4バイト)はすべてのUnicode文字に対応しており、WordPress 4.2以降のデフォルトです。古いサイトのDBをutf8mb4に移行することで文字化けを解消できます。
症状・原因
- 絵文字を投稿に入力すると「?」に化けて保存される
- 日本語タイトルや本文が一部文字化けしている
wp-config.phpにDB_CHARSETがutf8と設定されている- phpMyAdminでテーブルの照合順序が
utf8_general_ciになっている
解決手順
ステップ1:現在の文字コード設定を確認する
-- データベースの文字コードを確認
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = DATABASE();
-- テーブルごとの文字コードを確認
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME;
-- カラムごとの文字コードを確認(問題のあるカラムを特定)
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND CHARACTER_SET_NAME != 'utf8mb4'
AND CHARACTER_SET_NAME IS NOT NULL
ORDER BY TABLE_NAME, COLUMN_NAME;
ステップ2:データベースとテーブルをutf8mb4に変換する
-- ① データベース全体の文字コードを変更
ALTER DATABASE wordpress_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- ② 各テーブルを変換(全テーブル分実行)
ALTER TABLE wp_posts
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_postmeta
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_options
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_users
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_usermeta
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_comments
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_commentmeta
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_terms
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_term_taxonomy
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ALTER TABLE wp_term_relationships
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
ステップ3:シェルスクリプトで全テーブルを一括変換する
#!/bin/bash
# utf8mb4 への一括変換スクリプト
DB_NAME=$(wp config get DB_NAME)
DB_USER=$(wp config get DB_USER)
DB_PASS=$(wp config get DB_PASSWORD)
DB_HOST=$(wp config get DB_HOST)
# データベースの文字コードを変更
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e \
"ALTER DATABASE \`$DB_NAME\`
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 全テーブルを utf8mb4 に変換
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" \
-N -e "SHOW TABLES;" | while read table; do
echo "Converting: $table"
mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e \
"ALTER TABLE \`$table\`
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;"
done
echo "All tables converted to utf8mb4"
ステップ4:wp-config.php の文字コード設定を更新する
// wp-config.php: 文字コードと照合順序を utf8mb4 に変更
// 変更前
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
// 変更後
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', 'utf8mb4_unicode_ci');
// MySQL接続後に文字コードを明示的に設定
// (通常はWordPressが自動設定するが念のため)
// add_action('init', function(): void {
// global $wpdb;
// $wpdb->set_charset($wpdb->dbh, 'utf8mb4', 'utf8mb4_unicode_ci');
// });
ステップ5:変換後に絵文字と日本語の動作を確認する
# 絵文字が保存・取得できるか確認
wp post create \
--post_title="絵文字テスト 😊🎉🌸" \
--post_content="テスト投稿です。絵文字: 🚀💪✅" \
--post_status=draft
# 作成した投稿を確認
wp post list --post_status=draft --fields=ID,post_title | head -5
# DB の文字コードを最終確認
wp db query "SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME;" | grep -v utf8mb4
# 上記コマンドで出力がなければすべて utf8mb4 に変換済み
# MySQL の接続文字コードを確認
wp db query "SHOW VARIABLES LIKE 'character%';"
wp db query "SHOW VARIABLES LIKE 'collation%';"
注意事項
utf8mb4はutf8よりカラムあたり最大4バイト使うため、VARCHAR(191)の制限が生じる場合があります。CONVERT TO CHARACTER SETはインデックスサイズも自動調整しますが、ERROR 1071: Specified key was too longが出た場合はインデックスのカラム長を短くする必要があります- 変換前に必ずデータベースのバックアップを取得してください。
CONVERT TO CHARACTER SETは元に戻せません my.cnf(MySQL設定ファイル)にもcharacter-set-server=utf8mb4とcollation-server=utf8mb4_unicode_ciを追加することで新規テーブルがデフォルトでutf8mb4になります
まとめ
utf8mb4移行は①information_schema.COLUMNSで非utf8mb4カラムを特定、②ALTER DATABASE ... CHARACTER SET utf8mb4でDB全体を変更、③ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4を全テーブルに適用(シェルスクリプトで一括処理)、④wp-config.phpのDB_CHARSET='utf8mb4'・DB_COLLATE='utf8mb4_unicode_ci'に更新、⑤絵文字投稿テストとSHOW VARIABLES LIKE 'character%'で接続文字コードを確認します。