はずかしながら、以前のコーディングではうまくできたのに今回希望の処理が全く出来なくなってしまいました。
もとのソースがなくなってしまったので、原因を知りたく思います。
(ちなみに、サーバは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
です。
UNICODEで作ったはずのDBなのに、なぜASCIIで読み取られてしまうのでしょうか?
DB設定自体が UTF-8 でもクライアント側の設定しだいで文字コード変換がかかります。
リンク先にあるように、phpMyAdmin と作成したプログラムの両方で
SHOW VARIABLES LIKE 'char%';
を実行してみてください。
おそらく片方、もしくは両方の character_set_client が latin1 などの日本語の使用できない文字コードになっているはずです。
character_set_client が UTF8 になっていないプログラムでは SQL 文の発行前に、
SET NAMES UTF8;
を実行する必要があります。
有難う御座います。
ご指摘のとおり、ずばりサーバ側がutf8でphpはlatin1でした。
残念ながら、SET NAMES UTF8;でphpもutf8になりましたが全く別の文字化け(全角だけ空白)になってしまい、
mysql_set_charset()が、私が使っているphp5.2.2までがちょうど使えず、5.2.3からしか使えない、ということで
趣味の制作なのでMySQLをやめてPostgreSQLを使おうと思います。
いくらフリー(商用ライセンスまで出たんでしたっけ...)だとはいえ、ずいぶん無謀な仕様変更してくれるものだ...
(MYSQL4のときは普通に動いていたんですよね) すこし感情的な文になってしまって申し訳ないです。