さくらのサーバ・phpMyadminでのみ文字化けする
さくらのサーバ・phpMyadminでのみ文字化けするのでその対応。
引き継いだモノがさくらのサーバを使ったPHP+mySQL。
・ブラウザで見る限り文字化けはしていない。
・phpMyAdminを見ると日本語が文字化けしている。
・照合順序は「utf8_general_ci」。PHPファイルは「UTF8」。
・PHPでの接続方法は「mysqli_connect()」ってヤツ。
色々と調べても手ごろな回答が不明だったので、メモっておく。
やりたいこと
「ブラウザで文字化けしないが、phpMyAdminでのみ文字化けする」ので「phpMyAdminの文字化けを解消したい」ということ。
やらなくちゃいけないこと
・DBに保存するとき文字化けしていない状態で保存したい。
・DBから取り出すとき文字化けしていない状態で取り出したい(現状は無問題とはいえ、確認しておく)
・DBに保存されている文字化けデータを解消
まとめると下記2点を解決する必要があるみたいだ。
・PHPとmySQLとのやり取りの問題
・mySQLのデータの問題
PHPとmySQLとのやり取り
よくはわからんが・・・
・保存されているLATIN1のデータをUTF8に変換して取り出し
ってことをしているそうだ。
PHPとmySQLとのやり取りの文字コードが原因という噂があるので確認。
PHPで下記のような感じのソースを用意し、確認。
$dblink = mysqli_connect($host, $user, $pass, $dbnm);
// 文字コードの確認
$charset = mysqli_character_set_name($dblink);
printf (“Current character set is %s\n”,$charset);
これで文字コードが取得できる。
「utf8」だったら問題なかったんだが違うので「utf8」にする
PHPで下記のような感じのソースを用意し、設定。本来ならこのあとにselect文なりを使うわけだ。
$dblink = mysqli_connect($host, $user, $pass, $dbnm);
// 文字コードの変換
if (!mysqli_set_charset($dblink, “utf8”)) {
printf(“Error loading character set utf8: %s\n”, mysqli_error($dblink));
}
これで「PHPとmySQLとのやり取り」の問題は解決した。
・・・mySQLのデータが文字化けしたまんまなので、ブラウザにはそのまま表示される。
mySQLのデータ
DUMPする際にLatin1にすればいいとか言うけど・・・わかんないよ。
phpMyAdminでエクスポートする際に「Latin1」なんて無いよ・・・コンソールからしか出来ないのかな?
・・・プログラムで直接書き換えるのが手っ取り早いかもしれない。
if(mysqli_connect_errno()){
printf(“Connect db failed: %s\n”, mysqli_connect_error());
exit();
}
// ひとまずそのままデータを取ってくる
$q = “SELECT * from ○○○”;
if( $stmt = mysqli_prepare( $dblink, $q) ){
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
// 書き換える前にUTF8に変更。
if (!mysqli_set_charset($dblink, “utf8”)) {
printf(“Error loading character set utf8: %s\n”, mysqli_error($dblink));
exit;
}
$q = “UPDATE ○○○ SET ×××='” . $row[“×××”] . “‘ WHERE ■■■=” . $row[■■■];
if($stmt = mysqli_prepare($dblink, $q)){
mysqli_stmt_execute($stmt);
if(mysqli_stmt_affected_rows($stmt)!=1){
echo “err – update”;
}
}
}
mysqli_stmt_close($stmt);
}
もうちょっとスマートにできるんだろうけど、とりあえずのメモ書きとしては十分なのでこのままにしておく。