MySQL
文字コード変更

MySQLの文字コードをutf8mb4に変更

More than 1 year has passed since last update.

環境

  • AWS
  • MySQL

行ったこと

デフォルト設定

まずはDBの文字コードの確認

show variables like "chara%";

次にmysqlとクライアントのデフォルトの文字コードを設定する。

/etc/my.conf
[mysqld]
...
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

MySQLの再起動

/etc/init.d/mysqld restart

ここらへんまではQiitaで他の人も投稿をしているので、簡単に

既存のDBだった場合

テーブルの文字コード変更

確認をすると

use db_example;
show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    | 
| character_set_connection | utf8mb4                    | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8mb4                    |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

もともとDBができていたので、
databaseの文字コードだけ、utf-8のままだった。

alter table テーブル名 default character set utf8mb4;

をすることでデフォルトの文字コードを変更することができる。

ALTER TABLE テーブル名 MODIFY カラム名 値 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

カラムの文字列を変更をして確認をした。

show create table TWEET;

+----------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
+----------------------------------------------------------------+
| TWEET | CREATE TABLE `POST` (
  `POST_ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT,
  `POST_TEXT` varchar(255) NOT NULL COMMENT,
  `POST_DATE_TIME` datetime NOT NULL COMMENT,
  `USER_ID` bigint(20) NOT NULL COMMENT,
  PRIMARY KEY (`TWEET_ID`),
  KEY `FK_POST_USER` (`USER_ID`),
  CONSTRAINT `FK_POST_USER` FOREIGN KEY (`USER_ID`) REFERENCES `USER` (`USER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=166 DEFAULT CHARSET=utf8mb4   
+---------------------------------------------------------------+
1 row in set (0.00 sec)

DBの文字コード変更

※追記しました ご指摘ありがとうございます

変更する理由

新たにテーブルを追加するときに、DEFAULT CHARSET=utf8mb4 を指定し忘れると、DEFAULT CHARSET=utf8 のテーブルができてしまうので。

やり方

ALTER DATABASE {DB名} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.1 ALTER DATABASE 構文

詰まったところ

既存のDBに対して、デフォルト設定(my.conf)の変更だけでは、
適用されなかったためハマった。

※既存のDBの文字コードを変える場合は、utf-8から変える場合は、文字化けは置きないが、
他の文字コードの場合は文字化けする可能性があるので注意。