3
1

More than 3 years have passed since last update.

MySQL のエンコーディングを utf8 から utf8mb4 に変換する方法

Last updated at Posted at 2019-09-24

オープンソース 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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1