| ブログトップ | CMS関連 | PHP関連 |

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つ文字コードを変換なんて途方にくれます。こういう場合はプログラムの出番ですね。

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


<!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画面になります)

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

参考サイト

日々の生活にhappyをプラスする|ハピタス

このエントリーをはてなブックマークに追加

LINEで送る

nandani | 2012年06月02日 | コメント(0) | トラックバック(0) | CMS関連 | PHP関連

トラックバック

トラックバックURL

コメントする

※メールアドレスが公開されることはありません。

名前 *
メール*
URL
Copyright(c) 2010 - 2017 ダリの雑記