頻繁に実施したのでメモ。utf8で作成されていたデータベースをutf8mb4に置きかえる作業手順です。
もっと簡単にできるといいなぁ。
前提
- データベースインスタンスの文字セットは
utf8mb4
になっていること。mysql utf8mb4
で検索すれば多数の記事あり
以下の手順を実行した環境
- RDS for MySQL
- 移行元のMySQLサーババージョン(
mysql> select version();
) =>5.6.41-log
- 移行先のMySQLサーババージョン(
mysql> select version();
) =>5.7.26-log
- mysql client / mysqldumpのバージョン =>
5.6.46
- Amazon Linux2 上で実行
手順
概要手順
- 既存データベース内容をダンプ
- ダンプしたファイル内の
utf8
をutf8mb4
に置き換え - データベース再作成(削除・作成)
-
utf8mb4
化したダンプファイルをインポート
詳細手順
まずはデータベースをダンプします。
$ mysqldump -h <dbhost> -u<dbuser> -p<dbpassword> <dbname> > dump.sql
utf8
を utf8mb4
に置き換えます。下記ではsed
使ってますがもちろんどういう方法でもOKです。
$ sed -e 's/utf8 /utf8mb4 /g' ./dump.sql > ./dump_utf8mb4.sql
DB作成権限のあるユーザでmysqlクライアントに接続します。
$ mysql -u<user> -p -h <host>;
【オプション】データベースを削除。
すでに当該データベースを利用するアプリケーションが稼働していて、一時的にでも削除できない場合は、別データベースを作成・移行して、アプリケーションからの接続先を変更しても問題ありません。むしろダンプ失敗していたりして復元できない可能性も考慮するとそのほうが安全です。(上記で出力したダンプファイルは特定のデータベースには依存していません(use database
もcreate database
もない))
mysql> ★注意★ drop database <dbname>;
データベースを作成
mysql> create database <dbname> DEFAULT CHARACTER SET utf8mb4;
作成したデータベースに移動
mysql> use <dbname>;
utf8mb4
化したダンプファイルをインポート
mysql> source dump_utf8mb4.sql;
動作確認
任意の文字列カラムにビール(🍺)、寿司(🍣)を入力してエラーがでなければOKです。
utf8mb4
になっていなければ以下のエラーが発生します。🍣の場合。
SQL Error [1366] [HY000]: Incorrect string value: '\xF0\x9F\x8D\xA3' for column 'カラム名' at row 1
Incorrect string value: '\xF0\x9F\x8D\xA3' for column 'カラム名' at row 1