MySQLでコマンドプロンプトの日本語が文字化けする問題の暫定対応

mysqlクライアントで、マルチバイトのデータが存在するようなテーブルをSELECTすると文字コードの設定によっては文字化けをしてしまいムキー!! ってなります。

これは、コマンドプロンプトの文字コードが「CP932(Shift JISを拡張したもの)」で固定なため起こってしまう問題で、具体的にはmysqlクライアントのキャラクタセットの設定がShift JIS以外の設定だと文字化けしてしまうようです。

クライアントのキャラクタセットの文字コードは、以下のようにstatusコマンドを実行するとわかります。

mysql> use test_db;
Database changed
mysql> status;
--------------
mysql  Ver 14.7 Distrib 4.1.12a, for Win32 (ia32)
Connection id:          1
Current database:       test_db
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         4.1.12a-nt
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3306
Uptime:                 3 min 42 sec

Threads: 1 Questions: 8 Slow queries: 0 Opens: 12 Flush tables: 1 Open tables: 1 Queries per second avg: 0.036
————–

文字化けしているときは、上の赤字のとこみたいにキャラクタセットがShift JIS以外になっているはずです。これを暫定的に対処するには、SET NAMESステートメントを実行するといいみたいです。

SET NAMESステートメントは、リファレンスマニュアルによると

SET NAMES は、クライアントから送信される SQL ステートメントのキャラクタセットを示します。たとえば、SET NAMES cp1251 は 「このクライアントからの入力メッセージは今後、キャラクタセット cp1251 になります」 とサーバに通知します。サーバでは適宜、独自のキャラクタセットへと自由に変換することができます。

9.3.6. 接続のキャラクタセットおよび照合順序

と、あります。

つまり、クライアントに結果を返すときにサーバが変換してくれる文字コードの設定をするステートメントということですね。つまり、上記の例ではlatin1に設定されていたので、そもそもコマンドプロンプトの文字コードが何であろうとダメだったわけですね。

ということで、

mysql> set NAMES sjis;

とすると、Client charactersetが(Conn. charactersetも)sjisに設定され、コマンドプロンプトでも読めるShift JISでデータが送られてきたのでめでたく日本語が表示されました。

ただこの方法だと、キャラクタセットの設定はステートメントを実行したクライアントでのみ有効なので、できればデフォルト値を変えたいところです。

調べてみると、デフォルト値を変えるためにはmy.ini(linuxでいうところのmy.conf)に、

[mysql]
default-character-set-name=sjis

と書いてあげればデフォルトで設定される、はずとのことですが、僕の環境(4.1.12)だとなぜかうまくいきません。こっちについては、また次回ということで。

気に入ったらシェアお願いします!

この記事を書いた人

こんにちは!カノといいます👓
インターネットやテクノロジー、ビジネスモデルや歴史(世界史・日本史)、美術などが好きです。メガネのせいか真面目っぽく見えるらしいですが、基本的には昔からいい加減な性格です。
このブログは昔からずっと個人的な日記みたいな感じで書いてきていて、基本的には個人的なログになりますが、興味のあるところだけ読んでいただけるとうれしいです。コメントやTwitterのフォローなどは大歓迎です。

コメント

コメントする

目次