MySQLで文字コードをUTF-8に変更できない

 ·  ☕ 2 

character_set_serverがutf8に変更できずハマったのでまとめ。

はじめに

個人的にMySQLサーバを使いたくて試していたら、文字コードの変更が必要でした。
※文字コードを変更しないと、日本語データを投入した際にエラーが出ます。

/etc/my.cnfを書けば良いらしいのですが、うまくいきませんでした。

結論

設定ファイルの場所が違いました。
Ubuntuを使用しており、その場合/etc/my.cnfは存在せず、/etc/mysql/my.cnf を設定すれば良かった。
Ubuntu で MySQL

前提条件

  • Ubuntu 18.04LTS
  • MySQL Server 5.7

設定確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.08 sec)

mysql> 

設定

/etc/mysql/my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#
# The MySQL database server configuration file.
#

# ~~中略~~

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

# 以下を追記
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

※あれこれ調べてる内に、 MySQLのutf8はUTF-8じゃない らしいと知ったので、新たに作られたutf8mb4を設定した。
設定値は以下あたりを参考に。

設定後、MySQLの再起動を行う。
sudo systemctl restart mysql

事後確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
mysql> show variables like "chara%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> 

collation-serverはテーブル作った後に確認できるもよう

MySQLで照合順序を確認する方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mysql> use test;
Database changed
mysql> 
mysql> create table posts (
    ->   id int unsigned primary key auto_increment,
    ->   title varchar(255),
    ->   body text,
    ->   created datetime default current_timestamp,
    ->   updated datetime default current_timestamp on update current_timestamp
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> 
mysql> SHOW TABLE STATUS FROM test \G
*************************** 1. row ***************************
           Name: posts
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: 1
    Create_time: 2020-05-09 15:58:49
    Update_time: NULL
     Check_time: NULL
      Collation: utf8mb4_bin
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.01 sec)

mysql>

余談

ディストリビューションによって設定ファイルの場所が違うかも、と思い至るのに大分時間を食いました。
当たり前といえば当たり前なのかもしれませんが、まだまだ知らない事も多く…
MySQL公式のDocker環境では、設定ファイルが元々無くても、生成すれば何事もなく変更できたので、Ubuntuも同じだろうと思ってました。