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