Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
246
Help us understand the problem. What is going on with this article?
@decoch

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

More than 3 years have 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から変える場合は、文字化けは置きないが、
他の文字コードの場合は文字化けする可能性があるので注意。

246
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
decoch
フリーランスのiOSエンジニア。Swift / Firebase / CI/CD構築 / Flutter を主にやっています。
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
246
Help us understand the problem. What is going on with this article?