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など)だけで、何とかする事は出来ないものでしょうか?

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

回答の条件
  • 1人10回まで
  • 登録:2006/09/26 23:22:21
  • 終了:2006/09/28 17:16:45

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/09/26 23:27:55

ポイント200pt

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...

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

id:macrophylla

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

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

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

2006/09/27 00:31:52

その他の回答(6件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/09/26 23:27:55ここでベストアンサー

ポイント200pt

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...

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

id:macrophylla

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

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

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

2006/09/27 00:31:52
id:hamster009 No.2

hamster009回答回数3431ベストアンサー獲得回数502006/09/27 01:14:02

ポイント5pt

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

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

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

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

id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402006/09/27 01:27:19

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 としてしまうことで文字変換機能を無効にすることも出来ます。

id:macrophylla

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

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

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

としています。

2006/09/27 10:26:43
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402006/09/27 10:40:33

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

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

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

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

mbstring.internal_encoding = SJIS

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

id:macrophylla

ありがとうございます。

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

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

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

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

2006/09/27 11:03:58
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402006/09/27 11:53:46

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/

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

id:macrophylla

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をロード時にエラーが発生してしまいます。

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

2006/09/27 13:05:09
id:b-wind No.6

b-wind回答回数3344ベストアンサー獲得回数4402006/09/27 13:32:45

うーん。すみませんが設定の変更と言うのをどのタイミングでやられているのかがわからないので少しこちらも混乱しています。

きちんと設定できていれば途中での設定変更は必要ないはずです。


見る限りデータ投入時の問題のような気がするので PHP,MySQL のすべての文字コードを EUC_JP(ujis) に統一した後、

コマンドプロンプトからではなくデータ投入用の PHP スクリプトを作成して、そちらからデータを入れてみてもらえますか?


CSE に関してはだいぶ以前から開発が止まっているので libmysql.dll の新バージョンに対応していないのだと思います。

ODBC 経由にすることで接続できると思います。

id:macrophylla

PHPからデータを投入したところうまく行きました。

しばらくはこれで運用と開発を続行してみようと思います。

本当にありがとうございました。

2006/09/28 17:09:29
id:yyok No.7

yyok回答回数59ベストアンサー獲得回数32006/09/27 14:54:09

すみません、「投入するデータ自体は、SQLファイルとして・・・」

とのことですが、そのテキストファイルの文字コードは大丈夫でしょうか。

  • id:b-wind
    なるほど、そこまで調査済みでしたら
    ・DBに投入するSQLの文字コードは何か
    ・DB自体の文字コードは何か
    ・--skip-character-set-client-handshake オプションは使用しているのか
    ・DBへのデータ投入に使用したコマンドライン
    ・php.ini の mbstring 各種パラメータに設定している文字コードは何か

    を提示していただいたほうが解決に迎えるかと思いますが、いかがでしょうか?
  • id:macrophylla
    今は全て、XAMPPをインストールした初期状態に戻してあります。
    なので、DB自体の文字コードはlatin1です。
    ujisやsjisなど様々に試しましたが化け方が変わるだけでした。
    --skip-character-set-client-handshake オプションも駄目でした。
    php.iniからの設定も同様です。
    およそ検索で得た情報で考えられる設定は全て試しましたが、
    もう本当にどうしていいかわからないのです。

    データ投入はコマンドプロンプトから、
    当該SQL文をペーストして投入しています。
  • id:b-wind
    お手数ですがもう2点ほど確認させてください。
    ・php.ini の mbstring.internal_encoding の値。
    ・当該SQL文は Shift_JIS で投入されていると見ていいですか?
  • id:macrophylla
    mbstring.internal_encoding は 指定しない時もあれば、
    sjisにした時もあるし、EUC-JPにした時もあります。
    SQL文は、おそらくSJISで投入している事になっていると思います。
    (明示的にSJISを指定した場合も、同じ化け方をしたので)
    ただ、何も設定せずにstatusで確認した時は
    charset = latin1と表示されていました。

    今この時間帯は手元にソースがないので明確な解答が出来ず、申し訳ないです。
  • id:b-wind
    3番の回答でミスが有りました。
    skip-character-set-client-handshake をしているためデータ投入時点でも SET NAMES は使えないので、DBの文字コードと同じコードで投入する必要があります。
  • id:masomi79
    http://d.hatena.ne.jp/masomi79/20090216

この質問への反応(ブックマークコメント)

トラックバック

  • FreeBSD初心者運用日記 - [MySQL] FreeBSD初心者運用日記 2007-05-08 06:28:59
    [MySQL] 編集中^^; MySQLで日本語を扱うにはいろいろ注意点が必要なようだ。 ここでは、日本語の問題について調べたことをまとめてみる。 参考URL http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content
  • MySQL初心者日記 - [チップス]日本語対応 MySQL初心者日記 2008-12-17 23:53:30
    編集中^^; MySQLで日本語を扱うにはいろいろ注意点が必要なようだ。 ここでは、日本語の問題について調べたことをまとめてみる。 参考URL http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40 h
  • [MySQL+PHP]とにかくunicodeに masomi79の日記 2009-03-24 16:15:58
    :::::PHPのバージョン::::: 4.3.9 :::::MySQL のバージョン::::: mysqladmin version mysqladmin Ver 8.41 Distrib 4.1.22, for redhat-linux-gnu on i386 Server version4.1.22 Protocol version10 ConnectionLocalhost via UNIX socket UNIX socket/var/lib/m
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません