2019年12月7日土曜日

MySQLをWindowsで日本語を文字化けさせずに使う方法


背景

MySQLとはデータベースの1つです。
WindowsでMuSQLを使おうとして、データの作成やバックアップ時に日本語の文字化けに悩まされたので、備忘録として日本語を文字化けさせずに使う設定と操作方法を共有します。

インストール

MySQLのインストーラーをダウンロードして、MySQLサーバーをインストールしてください。
(数十MBのweb版と数百MBの全部入り版があります。自分の環境では前者だと不安定だったので、後者を利用しました。)

MySQL Community Downloads

インストール時にMySQLの管理ユーザーをパスワードも設定します。
このパスワードはDBとシステムの連携、クエリ時効画面の立ち上げ、dumpコマンドなどの実行などに使います。

上記の点以外は標準の選択肢でインストールしました。

クエリ入力画面の起動方法

自分が把握しているクエリ実行画面の起動方法は2種類です。
どちらも同じ機能が使えます。

方法1: MySQLコマンドラインクライアントを起動してパスワードを入力する。



方法2: コマンドプロンプトでMySQLを下記のコマンドで実行してパスワードを入力する
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root -p



この記事で「クエリを実行」とは、上記の方法で起動した画面にコマンドを入力して実行することを意味します。

日本語に対応するため、文字コードをutf8mb4に設定

MySQLインストール直後の設定は日本語を挿入できる文字コードになっていないため、utf8mb4に設定を変更します。
utf8ではなくutf8mb4なのは、MySQLにおけるutf8は3mbらしく、mb3だと難しい漢字や絵文字は対応できないためmb4を使います。

設定ファイルの先頭化末尾に下記の行を追加することで、文字コードを4バイトのutf8にできます。
設定を反映するにはPCを再起動してください。
(再起動せずに設定を反映する方法をご存知でしたら、コメントなどで共有していただけると嬉しいです。)
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server=utf8mb4

下記のクエリを実行して、filesystemとsystem以外の文字コードがutf8mb4になっていれば設定完了です。
SHOW VARIABLES LIKE "char%";
+--------------------------+---------------------------------------------------------+
| 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       | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.03 sec)

参考:
What is the difference between utf8mb4 and utf8 charsets in MySQL?
Mysql Workbenchでutf8mb4のテーブルを扱う際は要注意!!

バックアップ(dump)時は文字コードにbinaryを指定

DBの文字コードはutf8mb4を使いましたが、バックアップはbinaryを使います。
なぜなら、Windowsのコマンドプロンプトではutf8形式のクエリ読み込み時に文字化けするためです。
文字コードとしてbinaryを指定することで、文字化けを回避できます。

dumpコマンド実行時に下記のように「--default-character-set=binary」のオプションを付けるとバイナリ形式のクエリファイルが出来ます。
データベースの構造とデータをバックアップするためのクエリ
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -B some_database --default-character-set=binary -u root -r some-database-binary-xxxxxxxx.sql -p
上記のコマンドはsome_databaseというデータベースをバックアップするコマンドです。別のデータベースをバックアップする場合は、database_to_testを置き換えてください。
xxxxxxxxは20191207のように日付に置き換えると、いつのデータなのか分かるので便利です。

作成したバックアップ用のクエリファイルは、下記のコマンドで取り込めます。
注意: 先程のコマンドで作ったクエリファイルは、データベースがあったら削除して取り込む仕組みになっているため、既にデータがあるDBに対して適用する場合は、先にバックアップを作ってから適用することをお勧めします。
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" --default-character-set=binary -u root -p < some-database-binary-xxxxxxxx.sql

まとめ

文字化けに悩まされましたが、Windowsで日本語のデータを扱うMySQLの設定方法が分かりました。

変更履歴

2023.06.19 「漢字」を「感じ」と間違えていたので修正しました。

0 件のコメント :