Edited at

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から変える場合は、文字化けは置きないが、

他の文字コードの場合は文字化けする可能性があるので注意。