MovableType 7でutf8mb4対応

昨日、書いたエントリ。
実は、公開するまでに、えらく時間がかかってた。文章書くところは、 MarsEdit でそれなりにサクサク書けてはいたんですが、いざ公開しようと MarsEdit から MobavleType へのエントリーのアップロードを実行すると、エラーが出る。

最初は、 DB ぶっ壊れたかな?と思っていたのだけど、 MarsEdit で採れる Network Log を見てみると、どうもアップロードしようとしているエントリのデータ自体に問題がありそうなログが出てくる。

Network reply received: 2021-05-15 18:40:25 +0000
API Endpoint URL: https://www.downtown.jp/MT6/mt-xmlrpc.cgi
Method name: metaWeblog.newPost
Status code: 200
Succeeded: NO
Networking error: --Fault Error--
Fault code: 0
Fault string: Failed to execute INSERT INTO mt_entry
(entry_allow_comments, entry_allow_pings, entry_atom_id, entry_author_id, entry_authored_on, entry_basename, entry_blog_id, entry_category_id, entry_class, entry_comment_count, entry_convert_breaks, entry_created_by, entry_created_on, entry_excerpt, entry_keywords, entry_modified_by, entry_modified_on, entry_ping_count, entry_pinged_urls, entry_status, entry_tangent_cache, entry_template_id, entry_text, entry_text_more, entry_title, entry_to_ping_urls, entry_unpublished_on, entry_week_number, entry_current_revision)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
with allow_comments, allow_pings, atom_id, author_id, authored_on, basename, blog_id, category_id, class, comment_count, convert_breaks, created_by, created_on, excerpt, keywords, modified_by, modified_on, ping_count, pinged_urls, status, tangent_cache, template_id, text, text_more, title, to_ping_urls, unpublished_on, week_number, current_revision: DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9D\x84\x87 #...' for column `movabletype`.`mt_entry`.`entry_text` at row 1 at /var/www/MT6/extlib/Data/ObjectDriver/Driver/DBI.pm line 418.

ログに出ている "Incorrect string value: '\xF0\x9D\x84\x87 #...' for column" あたりのメッセージを手掛かりにして検索をかけてみると、MySQL/MariaDB での文字コードの扱いの問題であるらしい。
でも、エントリの内容見直してもおかしな文字使ってねぇしなぁ、といろいろ試してみたら、どうやら引用しようとしている 2 つの tweet の一方を入れないと問題が出ないことが判明。問題が出る tweet を引用しないって手もあったのだけど、いずれ似たような事態にぶち当たるだろうから、データベース側で対処することにした。

データベースで使う文字コードを変更する

この問題、界隈によっては「寿司ビール問題」として有名な話だったみたいですね。

さて、 MovableType は現在 MariaDB と組み合わせて使っているんですが、 MovableType のデータを格納しているデータベースを初期生成したのはいつだっけな?といういうぐらい前。下手すると MobavleType 5 を初期設定した状態から使い続けているんじゃないかなぁ。
MovableType 7 は、r.4607 以降で utf8mb4 に対応していて、これについては既にバージョンアップ済みだったので、データベース側を以下の順番で対応していけば良い、と。

  1. MySQL/MariaDB の設定で、デフォルトの文字コードを変更
  2. データベースそのものの文字コードを変更
  3. データベース内のテーブルの文字コード変更

まず /etc/mysql/mariadb.conf.d/50-server.cnf/etc/mysql/mariadb.conf.d/50-client.cnf で、それぞれ以下の設定を追記 or 修正して、 mariaDB を再起動。

[mysqld]
character-set-server = utf8mb4
[client]
default-character-set = utf8mb4

続いて MovableType のデータを格納しているデータベースの文字コードを、デフォルトの utf8_general_ci から utf8mb4_general_ci へ切り替え。

この操作は、コマンドラインで。

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9281
Server version: 10.5.9-MariaDB-1 Debian buildd-unstable

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> ALTER DATABASE movabletype CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.000 sec)

続いて、テーブルの方の文字コード設定をカラムも含めて変えていくわけですが、こちらは phpmyadmin を使って、一気に変更。

phpmyadmin でテーブルの照合順序を変更

これで、データベース側の準備も完了。

問題の原因となっていた tweet を入れてエントリを MarsEdit からアップロードしてみたら、成功。
🍣も🍺も問題なく使えるようになったかな?


トラックバック(0)

コメントする