人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPとMySQLの文字化けの問題について質問です。
以前、LinuxにてApache2.0.46、PHP4.2.2、MySQL3.23.58にてシステムを運用していました。それを、XAMPPの1.5.4(http://www.apachefriends.org/en/xampp-windows.html)を使いWinXPの環境に移植を試みているのですが、MySQLから取得してきたデータを正しく表示させることがどうしても出来ません。
PHPはEUCを使用しています。MySQLに投入するデータ自体は、SQLファイルとしてありますので何度でも1から入れ直すことが出来ます。ただ事情があり、PHPのソースそのものを弄るのは、出来る限り避けたい状況です。それ以外の設定(php.iniやMySQLなど)だけで、何とかする事は出来ないものでしょうか?

この問題についてネットでの検索と設定の反映には丸二日を費やしましたが、結局改善させることは出来ませんでした。「こうしてみては?」ではなく、「こうすればうまくいく」という仔細な設定のお手本を示してはくださいませんでしょうか。
ポイントについても、経過次第で配慮させていただきます。
宜しくお願い致します。

●質問者: macrophylla
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2.0 23 EUC Linux MySQL
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● b-wind
●200ポイント ベストアンサー

MySQL のバージョンがあがったことが原因でしょう。

文字コードの扱いが変わっています。

http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40

とくに最後の「結局、どうしろと? 」

http://www.mysql.gr.jp/frame/modules/bwiki/index.php?FAQ#ab2a69c...

が具体的な解になるかと思います。

◎質問者からの返答

恐れ入ります。当該URLは調査済みです。あくまで旧環境で使っていたことがあるというだけで、データ自体は始めから投入するわけですから、この解では解決になりません。

質問に誤解を招く表現があった点をお詫び致します。

問題となっているのはPHPの画面上で、MySQLから取得してきた情報が文字化けしてしまうという事です。


2 ● hamster009
●5ポイント

えと、原因は提供されているmysqlが日本語に最適化されてコンパイルされていないためです。mysqlを--with-charset=binaryつきでコンパイルし、/etc/my.cnfで文字コードを設定すれば、文字化けは起こらないようです。

あるいは、phpソースの中で明示的に文字コードを指定すること。

どちらもできない場合は、諦めてください。

はてなの過去ログを検索すれば、同じ質問が何回も出てきます。参考URLもそちらを見てください。


3 ● b-wind
●0ポイント

MySQL4.1 以降には文字コードの変換機能がありますので、

DBのエンコードが latin1 のままでは100%文字化けします。

utf8/sjis/ujis のどれかにするのがよいでしょう。

また、PHP側の変更は避けたいとの事ですので、

SET NAMES を使用できません。

skip-character-set-client-handshake オプションを指定し、

DBのエンコードと php.ini の mbstring.internal_encoding の値をそろえてください。

あとの問題はデータの投入方法に思えます。

コマンドプロンプトから実行して日本語が表示できる形であれば Shif_JIS で間違いないと思います。

mysql コマンドで接続後、

SET NAMES sjis;

を実行してからShift_JISのデータを投入してください。

そのまま SELECT してデータが化けてなければ問題はないはずです。


別解として2番の回答の方のように --with-charset=binary としてしまうことで文字変換機能を無効にすることも出来ます。

◎質問者からの返答

報告させていただきます。

いくつか試してみたのですが、

my.cnfに

[client]

default-character-set=SJIS

[mysqld]

skip-character-set-client-handshake

default-character-set=SJIS

[mysqldump]

default-character-set=SJIS

[mysql]

default-character-set=SJIS

を追加し、データ投入後に"SJIS"を"ujis"に書き換えMySQLを再起動することで、PHPで日本語として受け取ることが出来ました。

(?や?などの特殊文字は?で表示されてしまいますが)

これで閲覧は可能になったのですが、

PHPからのデータ投入に不安が残ります。

ここから改善する方法はありますか?

mbstringの各値は

mbstring.language = Japanese

mbstring.internal_encoding = EUC-JP

mbstring.http_input = auto

mbstring.encoding_translation = On

mbstring.detect_order = auto

mbstring.substitute_character = none

としています。


4 ● b-wind
●0ポイント
PHPからのデータ投入に不安が残ります。

は実際に試されて文字化けした、と言うことでしょうか。

skip-character-set-client-handshake 設定することで PHP の MySQL クライアントの文字コードはサーバーと同じ SJIS であると認識されます。

この場合、DB は SJIS で構築されているようですから、

mbstring.internal_encoding = SJIS

であるべきかと思います。

◎質問者からの返答

ありがとうございます。

設定したところ、PHPからも正しく日本語を入力すること出来ました。

ただ、やはり?や?のような特殊文字が、PHPから入力しても表示は?になってしまいます。

またこのままではコマンドプロンプト側からSQL文でデータを取得したい際に文字化けするので、設定をいちいち戻さなければなりません。

致命的な問題ではないのですが、解決法はございませんでしょうか。


5 ● b-wind
●0ポイント

PHP で表示されているページとしては EUC_JP なのですよね?

この場合 PHP スクリプトへの入出力時に

EUC_JP -> SJIS

の変換が行われるのでその際に機種依存文字の変換に失敗するのでしょう。

対策としては PHP,MySQL の文字コードすべてを統一するのが手っ取り早いでしょうか。

DBの文字コードを ujis にするか、サイト全体を sjis にするかの選択になりますが、コードの修正を伴わないのは当然DBの文字コードの変更になります。


コマンドプロンプトでの表示が文字化けしますか?

DBの文字コードも mysql コマンドの default-character-set もSJISなので大丈夫のはずなんですが・・・。

SHOW VARIABLES LIKE 'char%';

を実行してそれぞれの文字コードがどう設定されているか確認してみてください。

また、コマンドプロンプトではなく phpMyAdmin や CSE

http://www.hi-ho.ne.jp/tsumiki/

等を使用してみるのも手かもしれません。

◎質問者からの返答

ujis(EUC)にしても統一しても文字化けしたのです。

SJISでデータを投入後にmysqlの設定をujisにするというのが現状、PHP側で唯一正しく日本語を表示出来ている方法です。

現状でのSHOW VARIABLES LIKE 'char%';は

character_set_client | ujis

character_set_connection | ujis

character_set_database | sjis

character_set_filesystem | binary

character_set_results | ujis

character_set_server | ujis

character_set_system | utf8

という結果です。

phpMyadminはデータではなく、

phpMyadmin部分が文字化けして使えませんでした。

CSEはlibmysql.dllをロード時にエラーが発生してしまいます。

何か、根本的な間違いを侵しているのでしょうか。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ