【備忘録】さくらのレンタルサーバーでデータベースアップグレードしたらWordPressで絵文字が保存できなくなった

  • URLをコピーしました!

さくらのレンタルサーバーには、MySQL 5系のデータベースを使っている人のために、MySQL 8系にアップグレードするアップグレード機能が付いています。

データベースをアップグレードしたい | さくらのサポート情報

WordPressは2025年現在はMySQLの推奨要件が8.0以上になっています。
そのためアップグレード機能を使って8.0のデータベースに変更しました。

目次

絵文字が保存できなくなった

データベースアップグレード自体はすんなり完了し、ブログの表示にも異常はありませんでした。

しかし、ある日。過去記事に追記したところ「更新に失敗しました。 データベース内の投稿を更新できませんでした。」と表示されました。

WordPress投稿エディタのスクリーンショット。「公開に失敗しました。データベース内の投稿を更新できませんでした」
こちらは絵文字を含んだ新規記事を追加しようとしたときの表示

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 になっていました。

phpMyAdminのスクリーンショット。照合順序がutf8_general_ciになっている。
MySQL 5.7の wp_posts
phpMyAdminのスクリーンショット。照合順序がutf8mb3_general_ciになっている。
MySQL 8.0の wp_posts

本来、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;
phpMyAdmin の SQL 実行画面のスクリーンショット
phpMyAdminのスクリーンショット。post_content, post_title, post_excerpt の照合順序がutf8mb4_general_ciになっている。

※ ALTER TABLE wp_posts の行から実行したら「’post_date’ へのデフォルト値が無効です。」と表示されて実行できなかったため、今回はSET SESSION sql_mode = ”; を使って手っ取り早くSQLモードをゆるふわにしています。データの妥当性チェックの機能なので、ゆるふわにするべきかどうか検討して利用してください。

WordPressが接続しているデータベースを、作業用データベースに切り替えてテスト

  1. wp-config.php で接続しているデータベースを、元のデータベースから作業用データベースに切り替え
  2. 既存の投稿記事が問題なく表示されているかどうか確認
  3. 絵文字(👇など)を含む投稿記事を作成して公開・更新

無事、絵文字が保存できるようになりましたので成功です!

メモ

MySQL 8系では utf8mb4系 の照合順序が増えているようで、2025年4月時点のChatGPT(無料)は utf8mb4_0900_ai_ciutf8mb4_ja_0900_as_cs をおススメしてきましたが、下記の記事でいうところの「ずっと使ってきた実績と安心」で utf8mb4_general_ci を利用しました。

mita2 database life
MySQL 8.0 でも utf8mb4_general_ci を使い続けたい僕らは - mita2 database life このエントリーは MySQL Advent Calendar 2020 の 12/7 のエントリーです。 照合順序(COLLATION)とは 照合順序は文字列の比較やソート順のルールのことです。各キャラク...
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

CAPTCHA

目次