ダリの雑記:WEBプログラム版

MTのデータベースの文字コード変換【Movable Type】

サーバ移転の話が続きますが、MTを移転すると、管理画面に入ったとき、文字化けしているときがあります。

大体そういう場合は、データベースの文字コードがおかしかったりします。

特に「latin1_swedish_ci」の場合。

最近のレンタルサーバであれば「utf8_general_ci」に自動的になってくれたりするところもあるのですが、専用サーバなどの場合、phpMyAdminなどで何も考えずにデータベースを作ると大体この「latin1_swedish_ci」になります。

それでも、これからMTをインストールする分には、特に文字化け問題は発生しないのですが、問題はサーバを移転したとき。

以前のサーバでは「latin1_swedish_ci」でも正常に表示できていたはずなのに、移転した途端文字化けが発生したりします。

というわけで、このような場合は、「utf8_general_ci」に文字コードを変換してあげましょう。(MTの文字コード設定がUTF-8の場合)

とはいえ、ただ単にデータベースやテーブル、フィールドの文字コード設定を変えても解決しません。「latin1_swedish_ci」の文字コードで変換されたデータが入っているわけですから、これをutf8にコンバートする必要があります。(正確には一度バイナリ化し、バイナリからUTF-8に変換します。参考サイト

しかし、1つ1つ文字コードを変換なんて途方にくれます。こういう場合はプログラムの出番ですね。

※以下の処理は自己責任でお願いします。実行する際は必ずあらかじめバックアップをとってください。

[PHP]





MySQLの文字コード変換

$table_data){
$sql = "SHOW FIELDS FROM ".$table_data["name"].";";
$res = mysql_query($sql) or die(mysql_error());
$num = 0;
while ($row = mysql_fetch_array($res, MYSQL_NUM)) {
$table_array[$table_num]["field_name"][$num] = $row[0];
$table_array[$table_num]["field_type"][$num] = $row[1];
$num++;
}
mysql_free_result($res);
}

//照合順序を変換します
foreach($table_array as $table_num => $table_data){

foreach($table_data["field_type"] as $field_num => $field_type){

$field_name = $table_data["field_name"][$field_num];

if(preg_match("/^[varchar]/", $field_type)){

$sql = "ALTER TABLE ".$table_data["name"]." MODIFY ".$field_name." VARBINARY(255);";
mysql_query($sql);

$sql = "ALTER TABLE ".$table_data["name"]." MODIFY ".$field_name." ".$field_type." CHARACTER SET utf8 COLLATE utf8_general_ci;";
mysql_query($sql);

}elseif($field_type == "mediumtext"){
$sql = "ALTER TABLE ".$table_data["name"]." MODIFY ".$field_name." BLOB;";
mysql_query($sql);

$sql = "ALTER TABLE ".$table_data["name"]." MODIFY ".$field_name." ".$field_type." CHARACTER SET utf8 COLLATE utf8_general_ci;";
mysql_query($sql);
}
}

$sql = "ALTER TABLE `".$table_data["name"]."` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
mysql_query($sql);
}

mysql_close($conn);

}

?>




[/PHP]

DB設定(14~18行目)のところには、データベース情報を入力してください。

これをUTF-8形式で保存してください。ファイル名は拡張子がphpであればなんでも結構です。(もちろん半角英数字で)

サーバにアップロードし、ブラウザでアクセスして、「実行する」ボタンを押してください。

これで、テーブルおよびフィールドの文字コードが「utf8_general_ci」に変換されます。(ただし、データが多すぎると途中でInternal Server Error画面になります)

私が試した限りでは正常に動作しましたが、不具合が起きる可能性も十分すぎるほどありますので、実行前は必ずバックアップは取っておいてください。

参考サイト

モバイルバージョンを終了