| サイトのタイトルが保存できない現象【WordPress】ブログトップ | CMS関連 | PHP関連 | location.href (Javascript)と $_SERVER['HTTP_REFERER']; (PHP)
MTのデータベースの文字コード変換【Movable Type】
この記事は1年以上前の記事のため、内容が古い可能性があります。
サーバ移転の話が続きますが、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つ文字コードを変換なんて途方にくれます。こういう場合はプログラムの出番ですね。
※以下の処理は自己責任でお願いします。実行する際は必ずあらかじめバックアップをとってください。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>MySQLの文字コード変換</title> </head> <body> <?php if(!empty($_POST["go"])){ //DB設定 $host_name = "ホスト名"; $user_name = "ユーザ名"; $password = "パスワード"; $db_name = "データベース名"; // MySQL に接続。 $conn = mysql_connect($host_name, $user_name, $password) or die(mysql_error()); mysql_select_db($db_name) or die(mysql_error()); //テーブル名を取得します。 $res = mysql_query('SHOW TABLES;') or die(mysql_error()); while ($row = mysql_fetch_array($res, MYSQL_NUM)) { $table_array[]["name"] = $row[0]; } mysql_free_result($res); //フィールド情報を取得します。 foreach($table_array as $table_num => $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); } ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post"> <input type="submit" name="go" valur="実行する" /> </form> </body> </html>
DB設定(14~18行目)のところには、データベース情報を入力してください。
これをUTF-8形式で保存してください。ファイル名は拡張子がphpであればなんでも結構です。(もちろん半角英数字で)
サーバにアップロードし、ブラウザでアクセスして、「実行する」ボタンを押してください。
これで、テーブルおよびフィールドの文字コードが「utf8_general_ci」に変換されます。(ただし、データが多すぎると途中でInternal Server Error画面になります)
私が試した限りでは正常に動作しましたが、不具合が起きる可能性も十分すぎるほどありますので、実行前は必ずバックアップは取っておいてください。
参考サイト
nandani | 2012年06月02日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連
トラックバック
トラックバックURL
コメントする
※メールアドレスが公開されることはありません。