MySQLでテーブル作ったら突然文字コードがlatin1になっている！？

また起きてしまった時の為に、備忘録として残します。

## 環境・前提

Windows 10
つい数日前まではutf8で使っていたはずなのに、今日テーブル作ってみたら何故かDEFAULT CHARSETがlatin1に…
utf8に直します！

## テーブルの状況

``` コマンドプロンプト
MariaDB [db_spring]> show create table spring_user;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                            |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| spring_user | CREATE TABLE `spring_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `pass` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

原因を探ります。

` show variables like "chara%"; `
でMySQLの設定を見ると、

``` command
MariaDB [(none)]> 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       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
```

set_databaseがlatin1になっていますね。
ついでにserverも。。。

## 設定ファイルでutf8に直す

[mysqlで文字コードをutf8にセットする](https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a)より、
設定ファイルmy.ini(macの方は.cnf)を編集します。

my.iniファイルは
XAMPP Control PanelのMySQLのConfigボタン、
もしくは`C:\xampp\mysql\bin\my.ini`にあります。

``` my.ini
[mysqld]
...
character-set-server=utf8
```

my.iniファイルの[ mysqld ]セクションの最後にこれを追加し、再起動します。

確かに、以前ここに同じこと記述していたのに消えていますね。なんでだろう？
アップデート？とかあるのかな？分からん。。。

## 直っているか確認

とりあえず設定しなおしたので、
再度mysqlに入って確認。

```
MariaDB [(none)]> show variables like "chara%";
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | cp932                          |
| character_set_connection | cp932                          |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
| character_set_results    | cp932                          |
| character_set_server     | utf8                           |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
```

database,serverはutf8になりましたが、
今度は何故かcp932が出現してるwww
まぁ使っていって考えるので、とりあえずはこれでやってみます。


テーブル作成。

```
MariaDB [db_spring]> show create table spring_user;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                            |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| spring_user | CREATE TABLE `spring_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `pass` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

いや、latin1のままやん…

もしかすると、データベース自体がlatin1のままなのかも。

## データベース自体を作成し直す必要

ということで、mysqlの設定がutf8の状態で

- DB作り直し
- テーブルも作り直し

これで確認してみます。

```
MariaDB [db_spring]> show create table spring_user;
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                          |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| spring_user | CREATE TABLE `spring_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `pass` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

無事UTF8でテーブル作成できました。


## 結論

- 文字コード設定を変更したらDBも作り直さないと反映されない（当たり前だけど忘れがち）

1. mysqlログイン
2. 文字コード確認
3. データベースとテーブル作成
4. テーブルの文字コード確認

の順で作っていくのが安全。