はじめに文字化けしないために
MySQLで日本語周りの設定に時間を要したのでメモ。要点としては下記。
- DB作成前に目的の文字コードを事前に決めて各my.iniのデフォルト値を設定しておく。
- プログラム側でもDBにアクセスする際の文字コードを共通の設定にしておく。
- Windowsコマンドプロンプトでは
cp932
を使う。
my.ini の設定
下記の記事に助けられた。
出典:https://qiita.com/KawabataLemon/items/0edff5bd9b61368bedae
引用:「ポイントは、mysqldだけdefault-character-setではない」
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の文字コードに差異があった場合などにも意図しない文字コードになってしまうことがあった。
サーバデフォルトの設定
サーバデフォルトの設定
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)
データベースごとの設定
データベース
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)
テーブル毎の設定
テーブル毎の設定
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して作り直す。