2018/04/11更新

[サーバー] サクラのレンタルサーバーで、mysql接続時の文字化けに対応する

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日はサクラのレンタルサーバーにsshでログインして、mysqlコマンドでMySQLサーバーに接続した時に、文字化けしないようにする方法をブログに書きたいと思います。



目次




何が問題か

サクラのレンタルサーバーにsshでアクセスして、
# サクラのレンタルサーバーにssh接続
$ ssh [ユーザー名]@xxx.sakura.ne.jp
mysqlに以下のように接続した場合に、
$ mysql -u [ユーザー名] -p -h mysqlxxx.db.sakura.ne.jp
日本語を含む検索を行うと文字化けしてしまいます。
mysql> select post_title from wp_posts where post_type = "post" limit 1;
+------------+
| post_title |
+------------+
| ??ư???? |
+------------+
これでは困るということで、原因と対策をブログに書きたいと思います。



原因は何か

原因は、MySQLに接続する時に利用する文字コードが正しくないことです。文字コードの設定は、MySQLにログイン後に、以下のコマンドで確認できます。
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | ujis                       |
| character_set_connection | ujis                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | ujis                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
ここではMySQL接続時(character_set_client)の文字コードにujisが使われていることがわかります。
Wordpressを含む多くのアプリケーションでは、文字コードにutf8utf8mb4(=UTF8で絵文字も登録できる)を指定することが多いです。今回は保存時にはutf8を使っているのに、読み出す時にujisを使ったために文字化けした、という問題です。



文字化けを直すには

接続時に文字コードを指定することで解決できます。--default-character-set=utf8mb4(または--default-character-set=utf8)を指定します。
$ mysql -u [ユーザー名] -p -h mysqlxxx.db.sakura.ne.jp --default-character-set=utf8mb4
これで同じ検索をすると、文字化けせずに取得できます。
mysql> select post_title from wp_posts where post_type = "post" limit 1;
+------------+
| post_title |
+------------+
| こんにちは  |
+------------+
また、接続時の文字コードが変わっていることも確認できます。
mysql> 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       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
めでたしめでたし。



最後に

今回はサクラのレンサバを例に書きましたが、mysql接続は他の環境でもよくあることなので、--default-character-setは覚えておいて損はないです。またmysqlコマンド以外にも、PHPやNode.JSなどのプログラムからのアクセスでも文字コード指定は必要なので、文字コード指定には注意できると素敵です。

最後になりますが本ブログでは、Linux、フロントエンド、Swift、PHP、Node.js、Python、Java、インフラ、Go言語、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

[NodeJS] nodeで例外処理を書いて、最低限落ちないサーバー実装を行うException Handler
[NodeJS] requestモジュールを使って、サーバーから画像ファイルをダウンロードする
[サーバー] さくらVPSのセットアップ② 〜 nginxのインストール、Jenkinsのインストール、nginxとJenkinsの接続(リバースプロキシ)、nginxとPHP、パケットフィルタリング、など 〜
[サーバー] さくらVPSのセットアップ① 〜 OSの確認、ユーザー作成、Git、Ruby導入 〜
[サーバー] AmazonLinuxにMySQL5.7をインストールする
[サーバー] MySQL5.7でrootのパスワードを忘れた場合のリセット方法(CentOSやAmazonLinuxの場合)
[Go] net/httpパッケージでWebサーバー(handlerの書き方、静的ファイル配信、Basic認証、など)
RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。