php5.2とmysql5.1.19で質問です。

はずかしながら、以前のコーディングではうまくできたのに今回希望の処理が全く出来なくなってしまいました。
もとのソースがなくなってしまったので、原因を知りたく思います。
(ちなみに、サーバはXREAのものを使っています。)
mysqlのDBをUNICODEで作成して、phpMyAdminからUTF8で開き、テーブルを作成、データを挿入しました。
(データには日本語の全角文字も含まれます。)
そしてphpからmysql_connect->mysql_select_db->mysql_query->mysql_fetch_assocの順に処理して読み取りました。
読み取った日本語の内容をprintfで表示すると、?(はてな)に化けてしまいました。
ブラウザのエンコーディングをSJIS,EUC,JIS,UTF8、どれで表示しても全く同じ?(はてな)です。
そこで、mb_detect_encodingを実施してエンコードを調べてみましたら、なんとASCIIで返ってきました。
UNICODEで作ったはずのDBなのに、なぜASCIIで読み取られてしまうのでしょうか?
ちなみに、PHPの設定は、
mbstring.http_input=auto
mbstring.http_output=pass
mbstring.internal_encoding=UTF-8
です。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2007/12/11 23:28:47
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント100pt

UNICODEで作ったはずのDBなのに、なぜASCIIで読み取られてしまうのでしょうか?

DB設定自体が UTF-8 でもクライアント側の設定しだいで文字コード変換がかかります。


MyNA Web Site

リンク先にあるように、phpMyAdmin と作成したプログラムの両方で

SHOW VARIABLES LIKE 'char%';

を実行してみてください。

おそらく片方、もしくは両方の character_set_client が latin1 などの日本語の使用できない文字コードになっているはずです。


character_set_client が UTF8 になっていないプログラムでは SQL 文の発行前に、

SET NAMES UTF8;

を実行する必要があります。

id:HISI

有難う御座います。

ご指摘のとおり、ずばりサーバ側がutf8でphpはlatin1でした。

残念ながら、SET NAMES UTF8;でphpもutf8になりましたが全く別の文字化け(全角だけ空白)になってしまい、

mysql_set_charset()が、私が使っているphp5.2.2までがちょうど使えず、5.2.3からしか使えない、ということで

趣味の制作なのでMySQLをやめてPostgreSQLを使おうと思います。

いくらフリー(商用ライセンスまで出たんでしたっけ...)だとはいえ、ずいぶん無謀な仕様変更してくれるものだ...

(MYSQL4のときは普通に動いていたんですよね) すこし感情的な文になってしまって申し訳ないです。

2007/12/11 23:28:36
  • id:tezcello
    当然、mbstring.language は日本語が指定してありますよね?
    更に、php.ini の中で mbstring.internal_encoding は、 mbstring.language の後に置く必要があるそうですが、スクリプト内でセットする際も同じではなかったかなぁ...
    この辺りは大丈夫ですよね?

    なぜうまくいっていないかの答えではないですが、auto でエンコードの判別をしようとすると、UTF-8 の場合よく間違えるのではなかったでしたっけ?
    ascii よりも先に UTF-8, EUC を持ってくると誤検知が減ったような...

  • id:b-wind
    > いくらフリー(商用ライセンスまで出たんでしたっけ...)だとはいえ、ずいぶん無謀な仕様変更してくれるものだ...
    仕様自体は至極まともなもの。
    MySQL4.0 以前がさぼりすぎてただけだし、PostgreSQL も似たような機能をだいぶ前から実装してる。
    デフォルトが latin1 なのとちゃんとした使い方をみんな知らないだけ。
  • id:ffmpeg
    バージョンによって、文字コードの指定の書き方が異なります。

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

回答リクエストを送信したユーザーはいません