MySQL 文字化けの時に確認すべきところメモ

# はじめに文字化けしないために

MySQLで日本語周りの設定に時間を要したのでメモ。要点としては下記。

- DB作成前に目的の文字コードを事前に決めて各my.iniのデフォルト値を設定しておく。
- プログラム側でもDBにアクセスする際の文字コードを共通の設定にしておく。
- Windowsコマンドプロンプトでは`cp932`を使う。


# my.ini の設定

下記の記事に助けられた。
> 出典：https://qiita.com/KawabataLemon/items/0edff5bd9b61368bedae
引用：「ポイントは、mysqldだけdefault-character-setではない」

```powershell:my.ini

[client]
default-character-set=cp932
・・・

[mysql]
default-character-set=utf8
・・・

[mysqldump]
default-character-set=utf8
・・・

[mysqld]
character-set-server=utf8
・・・
```








# 文字化けの時に確認すべきところ

my.iniでデフォルト値を設定しても、各データベースごと、各テーブルごと、に独自の文字コードを持てるので文字化けの際はそれぞれ確認が必要。  
プログラムとMYSQLの文字コードに差異があった場合などにも意図しない文字コードになってしまうことがあった。


###サーバデフォルトの設定

```SQL:サーバデフォルトの設定
MariaDB [test2]> show variables like 'char%';
+--------------------------+--------------------------------+
| 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\ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
```

### データベースごとの設定
```SQL:データベース
MariaDB [test2]> show create database test2;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| test2    | CREATE DATABASE `test2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
```

### テーブル毎の設定
```SQL:テーブル毎の設定
MariaDB [test2]> show create table auth_group;
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                               |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auth_group | CREATE TABLE `auth_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(80) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

-- CHARSET=utf8　となっている

```

# 文字化けなおらないとき
- コマンドプロンプトで文字化けしている場合は下記を試す。
    - `mysql -u root test2 --default-character-set=sjis`
    - ↑のコマンドで、そのセッションに限り出力エンコードを`cp932`にする。
- dropして作り直す。