--- Title: 'MySQLでデータベースとテーブルの文字コード設定を変更する手順(utf8からutf8mb4など) #mysql' Keywords: - mysql Author: hiro_y Web: 'https://mimemo.io/m/xn7vg4WAroAa1qN' --- 要するに `utf8` になってしまっているのを `utf8mb4` にしたい、とか。 以前の担当者とかが何も知らないまま `utf8` に設定していて、あるとき絵文字を入力して問題が発覚すること、ありますよね…。 ## 現在の設定の確認 データベース自体の設定を確認。 ```sql show variables like "chara%"; ``` あとは `/etc/my.cnf` の次のような記述あたり(設定されていれば)。 ```:my.cnf [mysqld] character-set-server=utf8mb4 collation_server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 ``` 各テーブルの設定については `show create table` するなりする。 ## 変更していく手順 大丈夫だと思うけれど、作業前にバックアップを忘れずに。 ### my.cnfの書き換え MySQL 5.7.7以前を利用している場合、`/etc/my.cnf`の設定を変更してrestartする。5.7.7以降では以下の設定がデフォルトなので必要ない。 ```:my.cnf innodb_large_prefix = ON innodb_file_format = Barracuda innodb_file_format_max = Barracuda ``` `Index column size too large. The maximum column size is 767 bytes.` のエラーが出ないように拡張する。`Barracuda`は`innodb_large_prefix`を利用するために必要。 ### databaseの文字コード変更 データベース自体の文字コード変更。 ```sql alter database character set utf8mb4 collate utf8mb4_general_ci; ``` ### テーブルごとのrow_formatと文字コード変更 テーブルの`row_format`変更(MySQL 5.7.9以前を利用している場合)と文字コード変更(それぞれのテーブルに対して実施)。5.7.9以降は`ROW_FORMAT=DYNAMIC`がデフォルトなので変更の必要なし。 ```sql alter table ROW_FORMAT=DYNAMIC; alter table convert to character set utf8mb4 collate utf8mb4_general_ci; ``` ### クライアントアプリケーションの文字コード変更 もしWebアプリケーション側で接続時に文字コードを指定しているのであれば、その文字コード指定も改めて変更する。