MySQLでデータベースとテーブルの文字コード設定を変更する手順(utf8からutf8mb4など) #mysql version 2

2016/12/07 22:16 by hiro_y hiro_y
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
MySQLでデータベースとテーブルの文字コード設定を変更する手順(utf8からutf8mb4など) #mysql
要するに `utf8` になってしまっているのを `utf8mb4` にしたい、とか。
以前の担当者とかが何も知らないまま `utf8` に設定していて、あるとき絵文字を入力して問題が発覚すること、ありますよね…。

## 現在の設定の確認

データベース自体の設定を確認。

```sql
show variables like "chara%";
```

あとは `/etc/my.cnf` の次のような記述あたり(設定されていれば)。

```
```:my.cnf
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
```

各テーブルの設定については `show create table` するなりする。

## 変更していく手順

大丈夫だと思うけれど、作業前にバックアップを忘れずに。

`/etc/my.cnf`の設定を変更してrestart

```: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`を利用するために必要。


データベース自体の文字コード変更。

```sql
alter database DBNAME character set utf8mb4 collate utf8mb4_general_ci;
alter database <DBNAME> character set utf8mb4 collate utf8mb4_general_ci;
```

テーブルの文字コード変更(それぞれのテーブルに対して実施)。
テーブルのrow_format変更と文字コード変更(それぞれのテーブルに対して実施)。

```sql
alter table TABLENAME convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table <TABLENAME> ROW_FORMAT=DYNAMIC;
alter table <TABLENAME> convert to character set utf8mb4 collate utf8mb4_general_ci;
```

もしWebアプリケーション側で接続時に文字コードを指定しているのであれば、その文字コード指定も改めて変更する。      

要するに utf8 になってしまっているのを utf8mb4 にしたい、とか。
以前の担当者とかが何も知らないまま utf8 に設定していて、あるとき絵文字を入力して問題が発覚すること、ありますよね…。

現在の設定の確認

データベース自体の設定を確認。

show variables like "chara%";

あとは /etc/my.cnf の次のような記述あたり(設定されていれば)。

[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
my.cnf

各テーブルの設定については show create table するなりする。

変更していく手順

大丈夫だと思うけれど、作業前にバックアップを忘れずに。

/etc/my.cnfの設定を変更してrestart

innodb_large_prefix = ON
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
my.cnf

Index column size too large. The maximum column size is 767 bytes. のエラーが出ないように拡張する。Barracudainnodb_large_prefixを利用するために必要。

データベース自体の文字コード変更。

alter database <DBNAME> character set utf8mb4 collate utf8mb4_general_ci;

テーブルのrow_format変更と文字コード変更(それぞれのテーブルに対して実施)。

alter table <TABLENAME> ROW_FORMAT=DYNAMIC;
alter table <TABLENAME> convert to character set utf8mb4 collate utf8mb4_general_ci;

もしWebアプリケーション側で接続時に文字コードを指定しているのであれば、その文字コード指定も改めて変更する。