オープンソース CMS 「concrete5」も、 utf8mb4 に完全対応しました。
ただ、昔のサーバーにインストールした時、デフォルトの設定で UTF8 になってしまったので、作成済みの DB や DB 内のテーブルを一括で utf8mb4 に変換する必要があります。その方法です。
手順
1. バックアップ
データベースをバックアップします。
2. my.cnf に文字コードを設定
サーバーとクライアントの文字コードを設定
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
3a. concrete5 で UTF8 から UTF8mb4 に変更
concrete5 CMS は CLI コマンドで文字列を一気に変更できます。
config ファイルも書き換えてくれます。
管理画面から出来ますが、DBが大きいとタイム・アウトするので、CLI から実行することをおすすめ
$ cd [concrete5 へのパス]
$ concrete/bin/concrete5 c5:database:charset:set utf8mb4
3b. 手動で実行する (concrete5 のコマンドで修正できない時)
なんらかの原因で 3a の CLI コマンドだけで修正できない場合、手動で MySQL テーブルの文字コード設定を編集する必要があります。以下は手動で MySQL のコンソールから設定を修正する方法です。
サーバーの設定も変更しないとエラーが出る場合があります。特に MySQL 5.6 とそれ以前のバージョンは気をつけてください。
3b-1. データベースのキャラクターセットを変更
データベースの文字列を変更します。
MySQL にログインし、MySQL コマンドを実行します。
$ mysql -h {DB Host} -u {DB user} -p {DATABASE_NAME}
mysql> ALTER DATABASE {DB Name} DEFAULT CHARACTER SET utf8mb4;
mysql> ALTER DATABASE {DB Name} COLLATE utf8mb4_general_ci;
データベースの設定は完了です。
3b-2. 変更用 SQL ファイルを生成
MySQL からログアウトしてシェルに戻ります。
既存のDBテーブルを取得し、文字コードを変更する SQL を生成します。
$ (mysql -h {DB Host} -u {DB user} -p {DB Name} -e "show tables" --batch --skip-column-names | xargs -I{} echo 'alter table `'{}'` convert to character set utf8mb4;') > alters_$(date +%Y%m%d%H%M%S).sql
文字列を以下のように書き換えて実行します。
文字列 | 書き換え先 |
---|---|
{DB Host} | DB ホストアドレス |
{DB User} | DB ユーザー名 |
{DB Name} | DB 名 |
3b-3. SQL ファイルを実行して変更を適用
生成された SQL を実行。
mysql -h {DB Host} -u {DB User} -p {DB NAME} < alters_XXXXXXXXXXXX.sql
3b-4. MySQL を再起動
my.cnf の設定変更を適用するため MySQL サーバーを再起動します。
7. 変更 確認方法
MySQL テーブルの文字列設定を確認します。
MySQL サーバーにログインして確認します。
mysql> show variables like "chara%";
mysql> use {DB NAME};
Squel Pro などの MySQL クライアントソフトを使って確認してもらっても構いません。
トラブルシューティング
255 character error
concrete5 の CLI を実行していた時、下記のようなエラーが出るときがあります。
[ERROR] The database does not support index fields with a length up to 255 characters when using the collation "utf8mb4_general_ci"
my.cnf や DB 内で
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
等と STRICT_TRANS_TABLES
の表記があったら、それを削除してください。
MySQL 5.6 以下での対応方法
MySQL 5.6 以下であれば、デフォルトの設定が違います。以下の設定を追加し、MySQL を再起動しましょう。
innodb_file_format=Barracuda
innodb_file_per_table=ON # MySQL 5.6.6+ はデフォでオン
innodb_large_prefix=ON