サーバはさくらインターネットを利用してます。
レンタルサーバから専用サーバに移転したのですが、
専用サーバでは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
分かる方、ご回答、よろしくお願いいたします。
No.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に変更すれば
解決しますでしょうか?またそれは可能でしょうか?
No.2
- 回答日時:
MySQLの文字セットが UTF-8 になっているのですから、
$sql=mb_convert_encoding($sql,"UTF-8","EUC-JP");
とすべきです。
ご確認下さい。
No.1
- 回答日時:
> $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
となっています。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mb_send_mailの2重投稿を防止し...
-
SJIS→UTF-8変換後の文字化けに...
-
マルチバイト文字列(PHP)
-
エスケープ文字の復帰(¥r)と...
-
VBAのコマンドボタンの文字列の...
-
改行を読み飛ばす
-
文章から指定した範囲の文字列...
-
LaTeX: captionの中で改行した...
-
ソースコードの1行が長いとき...
-
PHPで変数から1行目だけを取得...
-
改行が半角スペースに変わる
-
delphi でのコード上でTab を入...
-
VBAを使ってHTMLソースから特定...
-
16進数の文字列をアスキーコー...
-
コンボボックスの項目中に改行を
-
Ruby ファイルの読み込み
-
文字の入力で横バー上段、中断...
-
全角英数文字が嫌われる理由を...
-
保存方法
-
ファイル入出力について教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字化け変換方法
-
UTF8メールがLotus Notesで文字...
-
PHP+Postgres 「髙」が文字化け
-
phpMyAdmin内での文字化け
-
SJISで取得した半角カナをUTF-8...
-
PHPmailerでの添付ファイルの文...
-
SJIS→UTF-8変換後の文字化けに...
-
SQL Serverで文字コードUTF-8
-
includeファイルの文字コードに...
-
PHPのsendmailでの文字化けにつ...
-
mb_strposについて予定外の結果...
-
「あ」→「82A0」のようにshift-...
-
mb_send_mailの2重投稿を防止し...
-
multipart/form-dataの文字化け
-
PHPスクリプトでエンコードエラー
-
IMAP関数で取得した文字列の、...
-
メールのCCに複数のアドレスを...
-
メール題名の文字化け
-
自動返信メールへの画像添付
-
mb_regex_encodingでエンコード...
おすすめ情報