コマンドプロンプトでのSQL文字化け対策

当サイトのデータはDB(MariaSQL)へ格納されていますが、DBの文字コードはUTF-8で運用しているので、WindowsのコマンドプロンプトでDBへ接続してSelect文などで何らかの情報を取り出そうとすると日本語部分の文字が化けてしまっていました。
これでは今後の運用に支障をきたすよねってことで、本稿では、この問題の原因と対処方法を解説していきます。少々エンジニアチックなネタで荒野行動とも全く無関係なのですが、私の環境で生じている問題を扱うサイトが中々見つからなかったこともあり、セルフ備忘録の意味も含め記事化します。

まず結論から述べますと、Windowsのコマンドプロンプトは標準でShift-JISの文字コードがセットされているので、文字コードがUTF-8にセットされているDBからデータを取得しても、当然ながら日本語部分は化けて表示されます。よって、このような場合には先にコマンドプロンプト側の対応文字コードをUTF-8へ変更する必要がある、という話になります。

一つずつ順を追って説明していきます。以下の通り、私のDB環境では文字コードをUTF-8に統一しています。

MariaDB [(none)]> show variables like 'char%';
+--------------------------+--------------------------------+
| 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\ |
+--------------------------+--------------------------------+

ですが、以下のようにSQLのSelect文で適当な投稿(下記例では2019年6月10日にPOSTされた投稿)を引っ張り出そうとすると、日本語の部分が化けていて読み取ることができません。その原因が、コマンドプロンプトの対応文字コードが既定でShift-JISであるため、となります。

MariaDB [wp]> select * from wp_kouyaposts where post_date like '2019-06-10%'\G
*************************** 30. row ***************************
                   ID: 273
          post_author: 1
            post_date: 2019-06-10 14:55:35
        post_date_gmt: 2019-06-10 05:55:35
         post_content: <!-- wp:html -->
<p>譛ャ繧オ繧、繝医・縲∫樟蝨ィ邂。逅・ココ縺悟、「荳ュ縺ォ縺ェ縺」縺ヲ縺・k闕帝㍽陦悟虚縺ィ縺・≧繧ケ繝槭・繧イ繝シ繝縺ョ繝医Μ繝薙い繧剃クュ蠢・→縺励◆諠・ア逋コ菫。縺ィ縲∵悽莠コ縺ョ證・▽縺カ縺励€∝所縺ウWeb髢「騾」謚€陦薙・蟄ヲ鄙堤岼逧・↓菴懈・縺励※縺・∪縺吶€ゅ◆縺螳滄圀縺ォ縺ッ縲√け繧、繧コ繧オ繧、繝医r菴懊k縺ィ縺励◆繧峨←繧薙↑螳溯」・′閠・∴繧峨l繧九・縺九↑縺 ・シ溘←繧薙↑繝阪ち縺瑚憶縺・□繧阪≧・溘→險€縺」縺溽匱諠ウ縺後€∽サ翫■繧・≧縺ゥ辭ア荳ュ縺励※縺・k闕帝㍽陦悟虚縺ォ邨舌・縺、縺・◆縺ィ縺薙m縺瑚オキ轤ケ縺縺」縺溘j縺励∪縺吶€・/p>
<p>繧ウ繝ウ繝・Φ繝・㍼縺ッ縺セ縺縺セ縺雋ァ蠑ア縺ァ縺吶′縲∵凾髢薙・縺ゅk縺ィ縺阪↓蟆代@縺壹▽繝医Μ繝薙い繧・ー上ロ繧ソ遲峨r霑ス蜉縺励※縺・¥縺、繧ゅj縺ァ縺吶・縺ァ縲√●縺イ螳壽悄逧・↓險ェ蝠城ゅ″縲∵凾髢薙▽縺カ縺励d遏・隴伜髄荳翫↓蠖ケ遶九※縺ヲ縺・◆縺縺代l縺ー縺ィ諤昴>縺セ縺吶€・/p>
<p>縺昴l縺ァ縺ッ逧・&繧薙€√%繧後°繧峨b繧医j繧医>闕帝㍽繝ゥ繧、繝輔r讌ス縺励∩縺セ縺励g縺・シ・strong class="pink_line">繝輔Ξ繝ウ繝臥筏隲九b螟ァ繝サ螟ァ繝サ螟ァ蜍滄寔荳ュ</strong>縺ァ縺呻シ・シシ(^o^)・・/p>
<!-- /wp:html -->

これでは投稿内容をSQLで確認ず不便なので、それを解消しましょうということで、以降はその具体的な方法を説明していきます。

まず、コマンドプロンプトの現在の文字コードを表示するためのコマンドを実行すると、このような結果が確認できると思います。

C:\Users\user>chcp
Active code page: 932

「932」はShift-JISの文字コードを表すので、SQLで取り出したデータの文字コード(UTF-8)とのミスマッチが生じ、コマンドプロンプト上で表示される日本語文字は全て化けてしまいます。
そのため、DBへ接続する前に予め以下のコマンドを実行して、文字データをUTF-8で扱うように設定を変更します。

C:\Users\user>chcp 65001
Active code page: 65001

上記の「65001」がUTF-8の文字コードを表しており、コマンドプロンプトがUTF-8形式の日本語を正しく扱える様になるので、その後DBへ接続してSelect文などでデータを取り出すと、以下の様に日本語も正しく表示されるようになります。これでコマンドプロンプトでも投稿データを自由に参照できるようになりました。

MariaDB [wp]> select * from wp_kouyaposts where post_date like '2019-06-10%'\G
*************************** 30. row ***************************
                   ID: 273
          post_author: 1
            post_date: 2019-06-10 14:55:35
        post_date_gmt: 2019-06-10 05:55:35
         post_content: <!-- wp:html -->
<p>本サイトは、現在管理人が夢中になっている荒野行動というスマホゲームのトリビアを中心とした情報発信と、本人の暇つぶ し、及びWeb関連技術の学習目的に作成しています。ただ実際には、クイズサイトを作るとしたらどんな実装が考えられるのかな ぁ?どんなネタが良いだろう?と言った発想が、今ちょうど熱中している荒野行動に結びついたところが起点だったりします。</p>
<p>コンテンツ量はまだまだ貧弱ですが、時間のあるときに少しずつトリビアや小ネタ等を追加していくつもりですので、ぜひ定 期的に訪問頂き、時間つぶしや知識向上に役立てていただければと思います。</p>
<p>それでは皆さん、これからもよりよい荒野ライフを楽しみましょう!<strong class="pink_line">フレンド申請も大・大・大 募集中</strong>です!\(^o^)/</p>
<!-- /wp:html -->

因みにコマンドプロンプトを終了しますと、次回起動時は文字コードが勝手にShift-JISへ戻ります。(したがって、新たにコマンドプロンプトを立ち上げてDBへ接続する前に都度 “chcp 65001” を実行する必要があります)

以上です。誰かの参考になれば幸いです。(^^)/