コマンドプロンプトで日本語が文字化けしてしまう!
コマンドプロンプト上でMySQLの各カラムを表示すると、日本語のみ文字化けしてしまっていた。
MariaDB [testdb]> insert into test(name,skill)values('みき','HTML');
MariaDB [testdb]> select* from test;
+----+------+-------+
| id | name | skill |
+----+------+-------+
| 1 | ・ン・ォ | HTML |
+----+------+-------+
これを解決するのに、丸3日くらいかかりました。
途中嫌になって放り出していましたが(笑)、teratailで神様のような方々からご回答頂き、解決することができました。
原因はいつも通り単純だったわけですが…
###前提・環境
・プログラミング学習を始めて4か月くらいの新人プログラマー
・今までMySQLは自分のMacで触っていたが今回は会社のWindowsを使っており、コマンドでの文字化けは初体験。
・Windows10
・XAMPP 7.2.6
・MySQL Ver 15.1 Distrib 10.1.33-MariaDB, for Win32
※SQL文はコマンドプロンプトで打ち込んでいます
###結論
コマンドプロンプト自体の文字コードと、DB・テーブルの文字コードが一致していなかったことが原因。
chcp
でコマンドプロンプト自体の文字コードを確認し、chcp 65001
で文字コードをUTF8に変更したらちゃんと表示されました。
試したこと
せっかく3日もかけたので、試したこと全部載せておきます。
初心者さんの参考になれば。
①まずはDBの文字コード設定を確認。
MariaDB [testdb]> 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\ |
+--------------------------+--------------------------------+
MariaDB [testdb]> show create database testdb;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| testdb | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
デフォルトがutf8なのが分かります。
②my.iniの[client]と[mysqld]の文字コードをutf8に書き換え
参考URL:https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
この記事を参考にmy.iniの2箇所を書き換えましたが、DBの設定を確認すると文字コードの設定が最初と変わっていなかったので
③my.iniの[mysql]のdefault-set-characterもutf8に書き換え
で、DBの設定を確認
MariaDB [(none)]> show variables like "chara%";
+--------------------------+--------------------------------+
| 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 | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
ちゃんとutf8に変わりました。
この状態で新たにDB作成し、INSERT。
MariaDB [(none)]> create database test2;
MariaDB [test2]> create table table1(id int auto_increment,name varchar(20),skill varchar(20),index(id));
MariaDB [test2]> insert into table1(name,skill)values('みき','PHP');
MariaDB [test2]> select* from table1;
+----+------+-------+
| id | name | skill |
+----+------+-------+
| 1 | ?ン・? | PHP |
+----+------+-------+
これでもダメだったので、
④https://teratail.com/questions/58424を参考にset namesしてみた
MariaDB [(none)]> set names cp932;
MariaDB [(none)]> create database newone;
MariaDB [newone]> create table tbl3(id int,name varchar(10),skill varchar(10));
MariaDB [newone]> insert into tbl3(id,name,skill)values(1,'みき','HTML');
MariaDB [newone]> select* from tbl3;
+------+------+-------+
| id | name | skill |
+------+------+-------+
| 1 | ・ン・ォ | HTML |
+------+------+-------+
これでもダメだったので、もうお手上げ状態。
teratailに質問を投げて、返ってきた回答をくまなく試しました。
⑤文字コードを「utfmb4」に設定した
MariaDB [(none)]> show variables like "chara%";
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
MariaDB [test1]> create table test2(id int,name varchar(20))default charset=utf8mb4;
MariaDB [test1]> insert into test2(id,name)values(1,'みき');
MariaDB [test1]> select* from test2;
+------+------+
| id | name |
+------+------+
| 1 | ?ン・? |
+------+------+
⑥文字コードをsjisに設定した
参照:https://teratail.com/questions/153238
MariaDB [test3]> SET character_set_results = sjis;
MariaDB [test3]> SET character_set_client = sjis;
MariaDB [test3]> create table test2(id int,name varchar(20))default charset=sjis;
MariaDB [test3]> insert into test2(id,name)values(1,'みき');
MariaDB [test3]> select* from test2;
+------+------+
| id | name |
+------+------+
| 1 | ??? |
+------+------+
###これでついに解決!
teratailで神様のような回答を頂き、解決。
sjis自体が文字化けしている事に対して
そこから設定すべきです。Mysqlの問題以前かも知れません。
https://qiita.com/user0/items/a9116acc7bd7b70ecfb0
とコメントいただき、コマンドプロンプト自体の文字コードをUTF8に変更(テーブルの文字コードがUTF8であるため)。
# chcp
現在のコード ページ: 932
# chcp 65001
Active code page: 65001
で、確認してみると…
MariaDB [trainingdb]> select* from userprofile;
+--------+-------------+-----------+-----------------+--------------+
| userid | name | bloodtype | origin | skill |
+--------+-------------+-----------+-----------------+--------------+
| 6 | みき | O型 | 九州・沖縄 | HTML,CSS |
| 7 | miki | O型 | 九州・沖縄 | HTML,CSS,PHP |
| 8 | みき | A型 | 神奈川県 | HTML,CSS |
+--------+--------------+-----------+-----------------+---------------+
苦節3日、やっとのことで解決しました!!
teratailで優しいご回答をくださった皆さんには感謝しかないです。
こういう初歩的な問題でハマるの早くやめたい・・・!
初学者の皆さん、一緒に頑張っていきましょう。。。
###teratailでの質問
https://teratail.com/questions/183601