MySQLでデータベースとテーブルの文字コードがlatin1だったのでUTF-8にする

MySQL5.6 on Linuxをインストールし、設定ファイルをデフォルトの状態でデータベース作成、テーブルを作成をしたら、文字コードがlatin1になっていたものを直したときのメモ。

# 参考

+ [MySQL徹底入門 第3版 ～5.5新機能対応～](http://www.amazon.co.jp/MySQL%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%EF%BD%9E5-5%E6%96%B0%E6%A9%9F%E8%83%BD%E5%AF%BE%E5%BF%9C%EF%BD%9E-%E3%81%A8%E3%81%BF%E3%81%9F%E3%81%BE%E3%81%95%E3%81%B2%E3%82%8D-ebook/dp/B00J8DSQGA/ref=sr_1_6?ie=UTF8&qid=1461067955&sr=8-6&keywords=mysql)

# 事象

テーブルを作成したが、文字コードがlatin1だった。。。。

```bash
# テーブル作成
mysql>create table t1 ( id INT, dep INT, name CHAR(30));

# テーブル情報確認
mysql>show create table t1;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                         |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `dep` int(11) DEFAULT NULL,
  `name` char(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```

SQLで文字コードの設定を確認します。

```bash
mysql> show variables like 'character%';
+--------------------------+------------------------------+
| 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/mysql56/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)
```

`mysql`コマンドを実行しているクライアントとMySQLサーバーをインストールしているサーバーは一緒で`locale`コマンドを見るとUTF-8になっています。

クライアント側は文字コードがutf8となっていることからも分かります。
ただ、サーバー側はlocaleの状態や接続クライアントの文字コードは関係ないみたいですね。書籍を確認するとMySQLのバイナリの標準キャラクタセットがlatin1らしいので特に何も設定しないと上記のようになっているのではないないかと思われます。

# 修正する

SQL実行時に文字コードを指定する方法もあるようですが、面倒なので固定でUTF-8を使うようにしたいです。

上記はMySQL起動時に読み込む設定ファイルを利用すればいけるようなのでやってみます。

```/etc/my.cnf
[mysqld]
...
character-set-server=utf8
```

上記記載後、再起動して確認します。

```bash
# mysqldプロセスの再起動
$sudo service mysqld restart

# 確認
mysql> show variables like 'character%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | utf8                         |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | utf8                         |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mysql56/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)
```

なお、確認するとテーブルだけでなくデータベースもlatin1だったのでこちらから再作成し直します。

```bash
mysql> show create database testdb;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
```

# 再作成して確認

まず、削除

```bash
# testdbの削除
mysql>drop database testdb;

# testdbの作成
mysql> create database testdb;

# testuserでログイン
$mysql -u testuser -p testdb

# データベースの文字コード確認
mysql> show create database testdb;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

# テーブル作成
mysql>create table t1 ( id INT, dep INT, name CHAR(30));

# テーブル情報確認
mysql>show create table t1;

# 確認
mysql> show create table t1;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                       |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `dep` int(11) DEFAULT NULL,
  `name` char(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```

無事、データベースもテーブルもUTF-8に出来ました!