XAMPPのバージョンがあがるにつれMYSQL→MariaDBへ変更されております。
MYSQLのころまでは、何も変更なしでコマンドプロンプトで文字化けは起きなかったのですがMariaDBにかわったころからコマンドプロンプトでは日本語は文字化けとなるようになっていきました。今回はこの対応方法をご説明いたします
原因
コマンドプロンプトはcp932というshift-jisに企業が変更を加えた文字コード。背景にはcp932 では、Microsoftが提示したSHIFT_JISに当時 NEC と IBM が拡張した文字が追加されていることの違いがあります。 (「NEC特殊文字」「NEC選定IBM拡張文字」「IBM拡張文字」が追加されている。windows11となってもコマンドプロンプトやpowershellは内部的にはいまだにこのcp932で動きます。今回はコマンドプロンプトがcp932で動作しているためにMariaDBとの不一致から発生しているのです。
※メモ帳などはutf-8で改善されておりますがwindows11でもいまだ一部の機能は未対応なのです。
※「髙 (はしご高)」や「﨑 (立ち崎)」などがあります。 Shift_JIS と Windows-31J の使い分を誤ったばかりに文字化けが発生します。
XAMPPインストールでは過去のXAMPPバーションではMYSQLの文字コードはcp932設定されておりコマンドプロンプト上は問題ありませんでした。
show variables like "chara%";
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | cp932 |
| character_set_connection | cp932 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | cp932 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
しかしMariaDBのバージョンがアップするにつれutf-8の設定と変わってきました。
またwindows11 の文字コードが utf-8 となっていない状態が初期状態のようです。windows11の方は要注意です。
対策1)windows11のロケール変更
対策2)MariaDBの文字コードをutf-8へ変更
my.ini の文字コードが cp932 と古い日本独特の文字コードでしたので一般的な utf-8 へ下記変更
[client]
default-character-set=utf8
省略
[mysqld]
character_set_server=utf8
skip-character-set-client-handshake
文字コードの設定
文字化けを起こさないように文字コードを「UTF-8」に設定します。 「default_charset」を検索して、下記の内容に修正します。
; PHP's default character set is set to UTF-8.
; http://php.net/default-charset
default_charset="UTF-8"
タイムゾーンの設定
タイムゾーンを日本に設定します。 [Date]を検索して、下記の内容に修正します。
[Date]
#date.timezone=Europe/Berlin
date.timezone = Asia/Tokyo
日本語利用のためのマルチバイト設定
日本語を使えるようにマルチバイトを設定します。 [mbstring]で検索して、下記の内容に修正します。
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
対策3)mysqlコマンドで cp932を認識させる
※毎回入力が必要です
mysql -u root -p
Enter password: **** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.24-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
MariaDB [(none)]>SET NAMES cp932;
その他の対策
コマンドプロンプトが原因なのでphpMyAdminでSQLを流す。 または参照であればコマンドプロンプト上で chcp 65001 でコマンドプロンプトはutf-8となり参照できます。但し、この場合、utf-8のマルチバイトはコマンドプロンプトでは対応できないため、テーブル作成もできない状態で参照系のみ有効です。直接原因はMYSQLがMariaDBへかわりバージョンアップされたためcp932未対応が直接的な原因です
注意事項
すでにcp932でデータベースを作成済みの場合は、データベースの削除が必要です
確認方法は show create database データベース名; でご確認ください
例)
show create database kadaidb;
下記が表示されますのでDEFAULT CHARACTER SET がcp932の際は削除となります
CREATE DATABASE `kadaidb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
検証結果
mysql -u root -p
Enter password: **** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.24-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
MariaDB [(none)]> show databases; +——————–+ | Database | +——————–+ | information_schema | | mysql | | performance_schema | | phpmyadmin | | test | +——————–+ 5 rows in set (0.002 sec)
MariaDB [(none)]> show variables like “chara%”; +————————–+——————————–+ | Variable_name | Value | +————————–+——————————–+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | D:\xampp\mysql\share\charsets\ | +————————–+——————————–+ 8 rows in set (0.001 sec)
MariaDB [(none)]> create database kadaidb; Query OK, 1 row affected (0.002 sec)
MariaDB [(none)]> use kadaidb Database changed MariaDB [kadaidb]> CREATE TABLE person ( -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -> title VARCHAR(50), -> price INT, -> created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -> ); Query OK, 0 rows affected (0.017 sec)
MariaDB [kadaidb]> INSERT INTO person(title,price) VALUES (“須田豚バラ”, 1520); Query OK, 1 row affected, 1 warning (0.002 sec)
MariaDB [kadaidb]> select * from person; +—-+————+——-+———————+ | id | title | price | created_at | +—-+————+——-+———————+ | 1 | ?{?c?リバ?? | 1520 | 2022-06-01 22:52:48 | +—-+————+——-+———————+ 1 row in set (0.000 sec)
MariaDB [kadaidb]> SET NAMES cp932; Query OK, 0 rows affected (0.000 sec)
MariaDB [kadaidb]> select * from person; +—-+———–+——-+———————+ | id | title | price | created_at | +—-+———–+——-+———————+ | 1 | ?{?c??o?? | 1520 | 2022-06-01 22:52:48 | +—-+———–+——-+———————+ 1 row in set (0.000 sec)
MariaDB [kadaidb]> INSERT INTO person(title,price) VALUES (“須田豚バラ2”, 1590); Query OK, 1 row affected (0.002 sec)
MariaDB [kadaidb]> select * from person; +—-+————-+——-+———————+ | id | title | price | created_at | +—-+————-+——-+———————+ | 1 | ?{?c??o?? | 1520 | 2022-06-01 22:52:48 | | 2 | 須田豚バラ2 | 1590 | 2022-06-01 22:56:08 | +—-+————-+——-+———————+ 2 rows in set (0.000 sec)
MariaDB [kadaidb]>
最後に
なかなか、バージョンアップによる問題って発生しますね。わたしもXAMPPはインストールするだけでデータベースはcp932の文字コードで設定されているものだとばかり思っておりました。生徒さんから指摘されて調査すると世界はutf-8文字コードですので、cp932は切り捨てられて行っていることが認識できる機会となりました。プログラムの世界は常に進化している。進化過程を知っている方ほどプログラムの世界は向いているかもしれません。
参考サイト