「これはヤバかったな」という遅刻エピソード

サーバはさくらインターネットを利用してます。
レンタルサーバから専用サーバに移転したのですが、
専用サーバではphpMyAdminで日本語データの文字化けが起きます。

専用サーバのphpMyAdminからDB作成の際、下記の設定で行い、

MySQLの文字セット UTF-8 Unicode (utf8)
MySQLの接続照合順序 utf8_unicode_ci
DB の照合順序 utf8_unicode_ci

レコードをINSERTする際、下記のように文字コードを指定し、
$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
execute_sql($con, $sql);

実行したら、phpMyAdmin内で日本語データが文字化けしました。
サイト内で表示しているDBデータ(日本語)は文字化けしませんでした。

DB の照合順序をutf8以外(ujis_japanese_ciなど)として、
DBを作った場合、レコードをINSERTしたら、サイト内のDBデータも
phpMyAdmin内データもどちらも日本語が文字化けします。

また、レンタルサーバのphpMyAdminからDBデータをエクスポートして、
専用サーバのphpMyAdminからインポートした場合、
読み込むDBデータファイルの文字コードをUTF-8にしなければ、
phpMyAdmin内で日本語データが文字化けしてしまいます。
ただ、UTF-8にしてインポートしてもphpMyAdmin内では
文字化けしませんが、サイト内で表示しているDBデータは
文字化けします。

専用サーバのphpMyAdminから
データを日本語の文字列に編集・更新したら、
phpMyAdmin内ではそのデータに関しては文字化けなく表示されますが、
サイト内ではそのデータは文字化けしてしまいます。

専用サーバ情報は下記の通りです。

【専用サーバ】
OS:CentOS 5
Apache 2.2.3
PHP5.1.6
DBサーバ:MySQL 5.0.77
アップしているファイルの文字コード:EUC

分かる方、ご回答、よろしくお願いいたします。

A 回答 (3件)

普通は、文字化け等で悩まなくてもいいように、HTMLの文字コード、PHPソースの文字コード、そしてDBの文字コードは一致させる事が求められます。


イレギュラーに文字コードをバラバラにするのであれば、文字コードをきちんと理解した対処をしましょう。

>レコードをINSERTする際、下記のように文字コードを指定し、
>$sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");
>execute_sql($con, $sql);

>サイト内で表示しているDBデータ(日本語)は文字化けしませんでした。

当然ですね、EUC-JPで保存してるのでとりだしたときもEUC-JPになります。
HTML(およびPHP)の文字コードとしては合っているので、結果的に文字化けしていないだけです。
保存時に一旦文字化けして、取り出し時に逆文字化けしているので、結果的に文字化けしていないように見える、と言えば判りやすいですかね。

ただ、
>実行したら、phpMyAdmin内で日本語データが文字化けしました。
これも当然です。
UTF-8のDBに対して、EUC-JPで保存しているのですから。
先の例で言えば、保存時に一旦文字化けしている結果です。

>phpMyAdminからデータを日本語の文字列に編集・更新したら、サイト内ではそのデータは文字化けしてしまいます。
これも当然です。
先の例で言えば、取り出し時に逆文字化けした結果です。

保存時には、#1、#2の方のいうようにUTF-8に変換して保存する必要があります。
$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");

そして取り出し時には、毎回、EUC-JPに変換して出力しなければなりません。
echo mb_convert_encoding($hoge['field1'],"EUC-JP","UTF-8");
echo mb_convert_encoding($hoge['field2'],"EUC-JP","UTF-8");
echo mb_convert_encoding($hoge['field3'],"EUC-JP","UTF-8");
このように面倒な事をしたくないために、イレギュラーな設計をしないのが普通です。

>$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
>で実行してみましたが、別の変な文字に文字化けしました。
おそらく、クライアントの文字コードが正しく認識されていないのではないかと思います。
MySQLに接続直後に以下の関数を実行してください。
mysql_set_charset('utf8');
クライアントの文字コードをMySQLに対して通知する関数です。
環境によっては、"SET NAMES utf8"をクエリーとして発行する方法をとらなければならないかもしれません。


※もしかしたら、上記のすべてが以下の一行一発だけで解決するんじゃないかな、との期待ができなくもありません。
理屈の上ではあり得るかも、というレベルですが。
mysql_set_charset('euc-jp');

この回答への補足

ありがとうございます。
とても分かりやすかったです。非常に参考になりました。
これから試してみるつもりです。結果も報告いたします。
ところで、MySQLの文字セットを UTF-8 からEUC-JPに変更すれば
解決しますでしょうか?またそれは可能でしょうか?

補足日時:2010/04/01 13:09
    • good
    • 0
この回答へのお礼

MySQLの文字セットの問題でした。
ありがとうございました。

お礼日時:2010/04/03 03:16

MySQLの文字セットが UTF-8 になっているのですから、


$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
とすべきです。
ご確認下さい。

この回答への補足

ありがとうございます。
MySQLの文字セットを UTF-8 からEUC-JPに変更することは可能でしょうか?

補足日時:2010/04/01 13:08
    • good
    • 0

> $sql=mb_convert_encoding($sql,"EUC-JP","EUC-JP");



とりあえず、これは
$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
と、脳内変換しました。

mb_internal_encoding() とか mb_language() は どうなってますか?

この回答への補足

ご回答、ありがとうございます。

$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
で実行してみましたが、別の変な文字に文字化けしました。
phpMyAdminだけでなく、サイト内でも文字化けが起きました。

ドキュメントルート(/home/▲▲▲/www)
の直下に.htaccessファイルがあり、
中は下記のようになってます。

php_value include_path "/■■■/PEAR/"
php_flag log_errors 'On'
php_flag register_globals 'On'
php_value mbstring.language "Japanese"
php_value mbstring.internal_encoding "EUC-JP"
php_flag mbstring.encoding_translation On
php_value default_charset "EUC-JP"
php_value mbstring.http_input auto
php_value mbstring.http_output "EUC-JP"
php_value mbstring.substitute_character none

ドキュメントルート /home/▲▲▲/www
phpMyAdminのディレクトリ /home/phpmyadmin

となっています。

よろしくお願いいたします。

補足日時:2010/04/01 02:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!