MySQL文字コード問題(1)

未分類 Add comments

最近XOOPSやOpenPNEの文字コードでハマリまくっている。ようやくそのトリックが分かったので、メモっておく


問題となる場合
まず文字コードが問題となるバージョンなのだが、4.1系でよく起こる。ソースからコンパイルしてインストールする場合には、オプションが指定できるので、大きな問題にはならないのだが、RPMなどの事前にコンパイルされたバイナリの場合は要注意だ。
RPMパッケージの場合
RPMによりインストールされたMySQLをデフォルトの設定ファイル(my.cnf)で起動してサーバの環境変数(文字コード周り)を確認すると以下のようになる。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

実はこのまま何も考えずにXOOPSやらOpenPNEなどをインストールしてもうまくいくのだが、よくよく考えるとおかしいことに気付く。文字コードlatin1とはいかがなものか?ISO8859-1で日本語が扱えるのか非常に疑問だったりする。
なぜうまくいくのか
それは、MySQLの起動オプションで「skip-character-set-client-handshake」を付けずに起動しているからだ。
このオプションがついていない場合、MySQLは接続された際の文字コードと内部に持っている文字コードの違いをうまい具合に吸収して、あたかも問題ないような挙動を見せる。ところが、日本語文字列で検索する場合にボロがでる。正しく検索できない文字が発生したりするのだ。
解決策
このような現象を避けるため、以下のオプションを付けて起動すれば正しく処理される

[mysqld]
default-character-set=ujis
skip-character-set-client-handshake
[client]
default-character-set=ujis

もちろんOpenPNEの場合は、ujisをutf8に変更することが必要だ。

Similar Posts:

Comments are closed.

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン