さくらのサーバ・phpMyadminでのみ文字化けする

2015/04/14

さくらのサーバ・phpMyadminでのみ文字化けするのでその対応。

引き継いだモノがさくらのサーバを使ったPHP+mySQL。
・ブラウザで見る限り文字化けはしていない。
・phpMyAdminを見ると日本語が文字化けしている。
・照合順序は「utf8_general_ci」。PHPファイルは「UTF8」。
・PHPでの接続方法は「mysqli_connect()」ってヤツ。

色々と調べても手ごろな回答が不明だったので、メモっておく。

やりたいこと

「ブラウザで文字化けしないが、phpMyAdminでのみ文字化けする」ので「phpMyAdminの文字化けを解消したい」ということ。

やらなくちゃいけないこと

・DBに保存するとき文字化けしていない状態で保存したい。
・DBから取り出すとき文字化けしていない状態で取り出したい(現状は無問題とはいえ、確認しておく)
・DBに保存されている文字化けデータを解消

まとめると下記2点を解決する必要があるみたいだ。
・PHPとmySQLとのやり取りの問題
・mySQLのデータの問題

PHPとmySQLとのやり取り

よくはわからんが・・・

・UTF8のデータをLATIN1に変換して保存。
・保存されているLATIN1のデータをUTF8に変換して取り出し

ってことをしているそうだ。

PHPとmySQLとのやり取りの文字コードが原因という噂があるので確認。

PHPで下記のような感じのソースを用意し、確認。

// DBに接続
$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文なりを使うわけだ。

// DBに接続
$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」なんて無いよ・・・コンソールからしか出来ないのかな?

・・・プログラムで直接書き換えるのが手っ取り早いかもしれない。

$dblink = mysqli_connect($host,$username,$password, $db_name);

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);
}

もうちょっとスマートにできるんだろうけど、とりあえずのメモ書きとしては十分なのでこのままにしておく。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい