うろぐ

インターネットサービス&デジタル家電&デジタルカメラ&パソコンのレビュー

MySQL 4.1以降のバージョンでは文字化けが当たり前となりました。
わたしはMySQL4.0.xと4.1.xと5.0.xと5.1.xの4つのバージョンを利用しているのですが、4.0.xは3.23.xとほぼ同じに取り扱えます。4.1.xでも「SET NAMES utf8」のお呪いを挿入することで、文字化けは起こらなくなりました。
MySQL5.0.xのサーバは最近契約をしたのですが、どうしても文字化けが防げないでいます。
この記事を書いている時点でも文字化けが解消したわけではないのですが、これまでの試行錯誤を備忘録として書き留めておき、後日の参考にしたいと思います。

MySQL 5.0.xの文字化け対策

サーバの主な構成とWebSiteの概要

  1. Apache:2.2.3
  2. PHP:5.1.6
  3. MySQL:5.0.45

Apacheモジュールでmod_rewriteを使用していますので、htmlファイルは1枚も存在しないシステムのWebSiteです。
インタープリターにはPHPではなくPerlを使用しています。
文字コードはUTF-8を利用しています。

順を追っての文字化け対策

  1. $dbh->do("SET NAMES utf8");を挿入しましたが全く効果はなく、文字化けが発生しました。文字化けは2バイト文字が「?????」になる良くあるパターンです。
  2. ホスティングサーバを利用しているので、サーバ会社に連絡を取り、MySQLサーバ自体の文字コードをUTF-8に固定してもらいました。「$dbh->do("SET NAMES utf8");」はサーバ会社から削除を依頼されたので削除しました。また、データベースを改めてアップロードしました。$dbh->do("SET NAMES utf8");を挿入すると一部のURLで正常に日本語の文字が表示されるようになりましたが、ほとんどのURLで文字化けが発生しています。$dbh->do("SET NAMES utf8");を削除すると全てのURLで文字化けが発生しています。
  3. CGIファイル、データベースファイルを再検証して文字コードがUTF-8になっていることを確認して、全てのファイルとデータベースをアップロードを行いましたが、効果が有りませんでした。状況は同じで$dbh->do("SET NAMES utf8");を挿入すると一部のURLで文字化けが発生せず、$dbh->do("SET NAMES utf8");を削除すると全てのURLで文字化けが発生します。

現時点ではここまでで、時間的な都合があり作業を止めてあります。予定ではこのサーバ上のシステムは6月中旬に稼動させられるはずでしたが、文字化け対策が思うようにはかどらず、作業がとまってしまいました。文字化けを除くシステムは別サーバで動作確認を完了しているので、時間的な無駄遣いが気になりだしました。
MySQLの書籍やネット上の情報は、これまでに試みた方法でほぼ文字化けは解消するように書かれているのですが、今回はそうも行かないようです。

あっけなく解決

7/9 2009追加
文字化けがあっけなく解決しました。
$dbh->do("SET NAMES utf8");をCGIのソースの中に何カ所か書き込んだところ、全ての文字化けが解消しました。これまでは$dbh->do("SET NAMES utf8");を最初に読み込ませていたのですが、ソースの途中で向こうとなるらしく、途中でも読み込ませるようにしました。
1ヶ月近くかかった文字化け問題がこうもあっさりと解決してしまうとは拍子抜けです。

7月 8th, 2009

Posted In: MySQL Server

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です