こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2008-02-06 10:08:38

QNo.3749280

暇なときに回答ください

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

phpからinsertして、phpでちゃんと呼び出せるということはphpとMySQLの間で文字コードの変換が行われてしまっていると推測されます。

insertやselectの前に

   $sql = 'set names utf-8';
   mysql_query($sql);

は挿入されていますよね?(お忘れではないと思いますが念のため・・)

投稿日時 - 2008-02-06 10:21:03

お礼

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

と記入してあります。そういうことではないでしょうか??

投稿日時 - 2008-02-06 13:50:25

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(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

これも、当初は解決しなかったように思うのですが、
今、元の設定に戻してみても文字化けが再現せず、
もうわけがわかりませんが・・・

投稿日時 - 2008-02-07 14:06:58

ANo.3

一応 この辺りも確認してみるとかどうだろう
http://www.php.net/manual/ja/function.mb-detect-order.php
http://www.php.net/manual/ja/function.mb-internal-encoding.php

投稿日時 - 2008-02-06 16:08:43

お礼

SAYKAさん、アドバイスありがとうございました。一回テーブルを空にしたうえ、

前者については、DB接続前に
mb_detect_order("UTF-8,eucjp-win,sjis-win");
と記述して、DBをUPDATEしてみましたが相変わらず化けました。


後者についても、DB接続前に
mb_internal_encoding("UTF-8");
と記述して、DBをUPDATEしてみましたが相変わらず化けました。

でも、いずれも知りませんでした。ありがとうございました。

投稿日時 - 2008-02-06 22:23:51

ANo.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」を送出してみてください。

投稿日時 - 2008-02-06 14:36:05

お礼

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 . "\", ";
:以下略

投稿日時 - 2008-02-06 22:10:24

あなたにオススメの質問