さくらのレンタルサーバーには、MySQL 5系のデータベースを使っている人のために、MySQL 8系にアップグレードするアップグレード機能が付いています。
データベースをアップグレードしたい | さくらのサポート情報
WordPressは2025年現在はMySQLの推奨要件が8.0以上になっています。
そのためアップグレード機能を使って8.0のデータベースに変更しました。
絵文字が保存できなくなった
データベースアップグレード自体はすんなり完了し、ブログの表示にも異常はありませんでした。
しかし、ある日。過去記事に追記したところ「更新に失敗しました。 データベース内の投稿を更新できませんでした。」と表示されました。

Chrome DevToolsを見ると /wp-json/wp/v2/posts/[投稿ID]?_locale=user に Failed to load resource: the server responded with a status of 500 が出ています。
普通に新規投稿はできていたのになぜ……?と思ったのですが、【WordPress】更新に失敗しました。データベース内の投稿を更新できませんでした。の原因は絵文字だった という記事を発見。
編集しようとしていた過去記事から、絵文字を除去したところ保存できるようになりました。
データベースアップグレード前は絵文字が保存できていた
データベースアップグレード前のMySQL 5.7のwp_postsでは、post_contentなどの照合順序が utf8_general_ci、アップグレード後のMySQL 8.0のwp_postsでは utf8mb3_general_ci になっていました。


本来、utf8_general_ci と utf8mb3_general_ci とでは、保存できるデータは同じはずだそうです。
であればアップグレード前から絵文字は保存できないはずでは……?
調査したところ「WordPressでUTF8なのに絵文字が保存できる理由→自動でHTMLエンティティに変換してくれているからだった。」という記事がありました。
つまり、データベースが「utf8_general_ci」なら絵文字が保存できたということですね。
それが utf8mb3_general_ci に変わったことで、保存できなくなった……ということでしょうか。
照合順序を utf8mb4_general_ci に変える
今回はとりあえず投稿本文(post_content)が保存できないことが問題だったので、とりあえず post_content, post_excerpt, post_title のDB照合順序を変更することにしました。
参考:【PHP】古いWordPressで絵文字を使えるようにするお話
作業用のデータベースを用意
WordPressから WP Migrate Lite プラグインでデータベースをダンプ(エクスポート)し、さくらのサーバーコントロールパネルで新規追加したデータベースにインポートしてます。
この新しいデータベースで、照合順序の変更作業をします。
作業用データベースの wp_posts テーブルの、カラムの照合順序を変更する
※今回はChatGPT(無料)に出してもらったSQLを、phpMyAdminのSQLの画面で実行して照合順序を変更しました。
SET SESSION sql_mode = '';
ALTER TABLE wp_posts
MODIFY post_title VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
MODIFY post_content LONGTEXT
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
MODIFY post_excerpt TEXT
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;


※ ALTER TABLE wp_posts の行から実行したら「’post_date’ へのデフォルト値が無効です。」と表示されて実行できなかったため、今回はSET SESSION sql_mode = ”; を使って手っ取り早くSQLモードをゆるふわにしています。データの妥当性チェックの機能なので、ゆるふわにするべきかどうか検討して利用してください。
WordPressが接続しているデータベースを、作業用データベースに切り替えてテスト
- wp-config.php で接続しているデータベースを、元のデータベースから作業用データベースに切り替え
- 既存の投稿記事が問題なく表示されているかどうか確認
- 絵文字(👇など)を含む投稿記事を作成して公開・更新
無事、絵文字が保存できるようになりましたので成功です!
メモ
MySQL 8系では utf8mb4系 の照合順序が増えているようで、2025年4月時点のChatGPT(無料)は utf8mb4_0900_ai_ci
や utf8mb4_ja_0900_as_cs
をおススメしてきましたが、下記の記事でいうところの「ずっと使ってきた実績と安心」で utf8mb4_general_ci
を利用しました。

コメント