2011年10月27日

さくらインターネットでphpMyAdmin上でだけ文字化けする場合

 さくらインターネット スタンダードプランでサイトを構築しているが、先日MySQL5が使えることに気づいてバージョンアップを行った。 データを移行どうにか終えてサイトも稼働開始。サイト上の文字化けも対応してよしよしと思っていたが、なぜかphpMyAdminでみたときにマルチバイト文字が文字化けしていることに気づく。。。

 サイトの文字コードはUTF-8で、もちろんPHPやHTMLのファイルの文字コードも合わせてあり、MySQLの設定も見る限りUTF-8になっている模様。サイトからINSERTしたデータをSELECTしてサイトに表示することは正常にできている。phpMyAdminだけ設定がおかしいのかとも思ったが、MySQLクライアントからサーバへ接続に問題があったらしい。

 PHPで mysql_client_encoding()の事項結果を出力してみると「latin1」とのこと。・・・何故?というかなんだ「latin1」って。utf-8を期待していたんだけど。
 結論から言うと、MySQLの接続の文字コードを直して文字化けを解消するにはMySQLへの接続の後、mysql_set_charset()で文字セットをutf-8にすればOK。ここでちょいはまりしたのは mysql_set_charsetの引数で"UTF-8"とするとだめで、


mysql_set_charset("utf8");
 としなきゃfalseになっちゃうというところ。


 以下は結論にたどり着くまでの調査と考察。



○接続の文字セットをSQLで変更してみる

 MySQLの接続の文字コードを接続後変更するには、「SET NAMES・・・」、「SET CHARSET・・・」などでできる。http://dev.mysql.com/doc/refman/5.1/ja/charset-connection.html 確かに接続後 「SET NAMES utf8」を実行しても文字化けはなくなった。でもこれらのSQLはセキュリティ上よくないらしい。
 
 SET NAMES 'x'ステートメントは下記の3ステートメントと等価です。
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

 とのこと、それぞれのSQLを別個に実行すると、「SET character_set_results='utf8'」さえ実行すれば文字化けが解消された。
でも 

>> SHOW VARIABLES LIKE 'char%'
 
Variable_nameValue
character_set_clientutf8
character_set_connectionutf8
character_set_databaseutf8
character_set_filesystembinary
character_set_resultsutf8
character_set_serverujis
character_set_systemutf8
character_sets_dir/usr/local/share/mysql/charsets/
 
? utf8になってるけど、これって違うにょか? 思うにこれはデフォルトの設定値でいざ接続されたときの接続の文字セットは別の要因もあってきまるんだろなぁ。


 ○mysql_set_charsetは優れもの。

 「SET NAMES・・・」、「SET CHARCTER・・・」とかで接続の文字セットを変えても その後mysql_client_encodingでみても文字セットは変わっていない。。。(文字化けは解消するのに)。この状態だとエスケープ処理に影響するらしい。そこらへんmysql_set_charset("utf8")で接続の文字セットを変えればその後の認識される文字セットもutf8になった。なんだか安心。
 

  



posted by goy at 16:10 | Comment(1) | TrackBack(0) | IT | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
はじめまして、違うレンタルサーバーですが同じ症状が出ていていろいろ調べていたらここの記事にたどり着きました。
おかげ様で症状が改善できました。
ありがとうございました!!
Posted by SRばちょう at 2012年05月26日 17:41
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。