• ベストアンサー

UTF8のPHPコードから日本語をINSERTするとphpMyAdmin上で文字化けしてしまう

・WindowsXP(SP2)IIS5.1 ・PHP 5.2.5 Win32 ・MySQL 5.1.22 RC Win32 ・phpMyAdmin 2.11.4 多言語(日本語と中国語)を扱える簡単なシステムを試作しているのですが、 test1.php(UFT8-BOM無し)からINSERTしたレコードをphpMyAdminから閲覧 すると日本語が「財団法人æ」などと文字化けしまくっています。 test2.phpからSELECTすると、まったく文字化けなく呼び出せます。 また、phpMyAdminから直接INSERTしたレコードば文字化けしません。 当初、MySQL4.1.22-win32や、phpMyAdmin 2.8.2.4だったので、 冒頭の最新バージョンにしたりもしてみましたがだめでした。 過去ログや、Webで昨日さんざん調べてみて、確認したのは以下の設定です。 (1) C:\Program Files\MySQL\MySQL Server 5.1\my.ini: [mysqld] character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 (2) C:\Inetpub\wwwroot\phpMyAdmin\libraries\config.default.php $cfg['DefaultLang'] = 'utf-8'; $cfg['DefaultConnectionCollation'] = 'utf8_general_ci'; $cfg['DefaultCharset'] = 'utf-8'; (3) MySQL Server Instance Config Wizard UTF8を選択しました(MySQL の文字セット: UTF-8 Unicode (utf8)) MySQL 接続照合順序 utf8_general_ci

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

phpからinsertして、phpでちゃんと呼び出せるということはphpとMySQLの間で文字コードの変換が行われてしまっていると推測されます。 insertやselectの前に    $sql = 'set names utf-8';    mysql_query($sql); は挿入されていますよね?(お忘れではないと思いますが念のため・・)

litton101
質問者

お礼

shimixさん、早速のご回答ありがとうございます。 おかげさまで アドバイスで「何が起こっているか?」については何となく 想像がついてきたような気がします。 >   $sql = 'set names utf-8'; >    mysql_query($sql); > > は挿入されていますよね?( 元質問に書きましたように、 C:\Program Files\MySQL\MySQL Server 5.1\my.iniに、 [mysqld] init-connect = SET NAMES utf8 と記入してあります。そういうことではないでしょうか??

その他の回答 (3)

noname#185101
noname#185101
回答No.4

元質問者です。 今朝からもう一度Web情報を結果的に、突如直っていました。 なぜだかわかりませんが、 昨日までは http://www.artful.jp/blog/archives/2006/07/xamppmysqlphpmy.html MySQLのmy.iniの [mysqld] [mysqldump] [mysql] phpMyAdminのconfig.default.phpの $cfg['DefaultLang'] = 'utf-8'; $cfg['DefaultCharset'] = 'utf-8'; のほか、#2さんのお礼に書いたことなどです。 これらを散々やって、IIS、MySQLサーバー、WindowsXPを 何度も再起動しても直りませんでした。 今日、 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP254JP254&q=phpmyadmin+%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91%e3%80%80UTF8 http://oshiete.goo.ne.jp/search/search.php?status=select&from=&PT=&nsMT=&MT=phpmyadmin+%CA%B8%BB%FA%B2%BD%A4%B1+UTF-8 ここらで出てきたことを片っ端からためし、 新規にやったことといえば、php.iniの mbstring周りの設定を見直したくらいです。 http://takapop2ch.blog103.fc2.com/blog-entry-7.html http://jp2.php.net/manual/ja/ref.mbstring.php これも、当初は解決しなかったように思うのですが、 今、元の設定に戻してみても文字化けが再現せず、 もうわけがわかりませんが・・・

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.3
litton101
質問者

お礼

SAYKAさん、アドバイスありがとうございました。一回テーブルを空にしたうえ、 前者については、DB接続前に mb_detect_order("UTF-8,eucjp-win,sjis-win"); と記述して、DBをUPDATEしてみましたが相変わらず化けました。 後者についても、DB接続前に mb_internal_encoding("UTF-8"); と記述して、DBをUPDATEしてみましたが相変わらず化けました。 でも、いずれも知りませんでした。ありがとうございました。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>元質問に書きましたように、 >C:\Program Files\MySQL\MySQL Server 5.1\my.iniに、 >[mysqld] >init-connect = SET NAMES utf8 >と記入してあります。そういうことではないでしょうか?? それだけで大丈夫なのであれば「phpから接続直後にset names utf-8が必須」という状況は出て来てないだろうと思うのですが・・。とりあえず接続直後に「set names utf-8」を送出してみてください。

litton101
質問者

お礼

shimixさん、たびたびのご回答ありがとうございました。 ご教示のように、下記のとおり 「接続直後に「set names utf-8」を送出」してPHPから DBをUPDATEしてみましたが、改善しませんでした。 まずはご報告まで。 $con = mysql_connect(localhost, root, pass); $selectdb = mysql_select_db(mydb, $con); $sql = "select count(*) as cnt from mytable where id = '" . $_SESSION["id"] . "'"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $reccnt = $col["cnt"]; mysql_free_result($rst); if ($reccnt > 0) { $sql = "set names utf-8";   //ここに挿入 mysql_query($sql);       //ここに挿入 $sql = "update mytable set"; $sql .= " Col1 = \"" . $Col1 . "\", "; :以下略

関連するQ&A