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)だとなぜかうまくいきません。こっちについては、また次回ということで。

コメント

コメントする

目次