torutkのブログ

ソフトウェア・エンジニアのブログ

さくらVPSのOSをCentOS 8に更新、さらにRedmineを4.1に更新(続々々々)

さくらVPSのOSをCentOS 8に、Redmineを4.1に更新、の続き(5日目)

既に対処が終わっている内容ですが、以下の続きです。

torutk.hatenablog.jp

MariaDB文字コードを、utf8mb4に設定しました。これはUTF-8で1~4バイトの範囲を扱える設定です。一方、MariaDB文字コードをutf8とした場合は、UTF-8で1~3バイトの範囲(基本プレーン)しか扱えません。utf8のデータベースに、例えばUTF-8で4バイトで表現される絵文字をWikiに記載し保存しようとするとエラーとなってしまいます。

ここで、今回の更新で起きた問題は、RedmineのこれまでのデータベースはMySQLのutf8で作成したものを移行してきたことに起因するものです。具体的には、新たにMariaDB文字コードをutf8mb4に設定してもデータベース(テーブル)はutf8のままであり、UTF-8の4バイト文字を入れるとMariaDBの設定自体はutf8mb4であってもテーブルはutf8のためエラーとなるというものです。

今回、MariaDBを設定後にRedmineのデータベースを手動で作成し、その後に旧RedmineMariaDBからダンプしたデータをインポートしたので、データベースはutf8mb4ですが、Redmineの各テーブルがutf8のままとなっている状況です。

utf8からutf8mb4への変更は、UTF-8の1~3バイト文字からUTF-8の1~4バイト文字への拡張のみであるため、文字のデータそのものはまったく変更する必要はなく、単にテーブル(カラム)の文字列の文字コード設定をutf8からutf8mb4へ変更するだけとなります。

1つのテーブルについて、文字コードをutf8からutf8mb4に変更するには次のSQL文を実行します。 例えばattachmentsテーブルの文字コードをutf8mb4に変更する場合のSQL文は次となります。

> ALTER TABLE attachments CONVERT TO CHARACTER SET utf8mb4;

さて、Redmineのデータベースには、テーブルが多数(約70個)あります。 上述のコマンドを各テーブルについて一つ一つ入力して実行するのは大変です。

SQL文で頑張る方法もありそうですが(SELECT CONCAT ...)、ちゃんと動くか不安があったため、Linuxのテキストファイルに落としてから、これを実行することにしました。

~$ for t in $(mysql -uredmine -pxxxxxxxx redmine -e "show tables" -s -N); do echo "ALTER TABLE $t CONVERT TO CHARACTER SET utf8mb4;"; done > alter_tables.sql

あとはこのファイルをMariaDBに読み込ませて実行させます。

~$ mysql -uredmine -pxxxxxxxx redmine < alter_tables.sql