2026年6月25日

2026年6月25日

WordPressのデータベースの文字コードをUTF-8に統一する方法

はじめに

WordPressがutf8(3バイト)で作成されたDBに絵文字を保存しようとすると文字化けが発生します。utf8mb4(4バイト)はすべてのUnicode文字に対応しており、WordPress 4.2以降のデフォルトです。古いサイトのDBをutf8mb4に移行することで文字化けを解消できます。

症状・原因

  • 絵文字を投稿に入力すると「?」に化けて保存される
  • 日本語タイトルや本文が一部文字化けしている
  • wp-config.phpDB_CHARSETutf8と設定されている
  • 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%';"

注意事項

  • utf8mb4utf8よりカラムあたり最大4バイト使うため、VARCHAR(191)の制限が生じる場合があります。CONVERT TO CHARACTER SETはインデックスサイズも自動調整しますが、ERROR 1071: Specified key was too longが出た場合はインデックスのカラム長を短くする必要があります
  • 変換前に必ずデータベースのバックアップを取得してください。CONVERT TO CHARACTER SETは元に戻せません
  • my.cnf(MySQL設定ファイル)にもcharacter-set-server=utf8mb4collation-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.phpDB_CHARSET='utf8mb4'DB_COLLATE='utf8mb4_unicode_ci'に更新、⑤絵文字投稿テストとSHOW VARIABLES LIKE 'character%'で接続文字コードを確認します。

お気軽にご相談ください

お見積りへ お問い合わせへ