inmotion inMotion のデータベースの文字コードを UTF-8 に変更する方法

2013年4月19日

inMotion でデータベースを作成する際は、「cPanel」の「MySQL Database Wizard 」などで作成するため、「phpMyAdmin」の「データベース」→「データベースを作成する」で「照合順序」を指定して作成することができない。

このため、データベース作成後、必要であれば文字コードを変更する。
下記のスクリプト(convert.php)を作成し、適当なディレクトリにアップロードして、スクリプトを実行すると、指定したデータベースの文字コードを変更できる。

追加情報

2013年9月4日
本日データベースを追加する際に、「MySQL Database Wizard 」でデータベースを作成後、「phpMyAdmin」で作成したデータベースを選択し、上部のタブの「操作」をクリックすると、以下のような画面が表示された。

im_phpadmin01

初期状態では文字コードは「latain1_swedish_ci」になっている。

ここの「照合順序」で文字コードを設定できるので、プルダウンから「utf8_general_ci」を選択して「実行」をクリック。

inmotion_phpadmin

以前 inMotion に問い合わせたときは、スクリプトを使って変更する方法を教えてもらったが、こちらの方が簡単。

im_phpadmin02

上記の方法が使えない場合は以下のような方法もある。

以下は(スクリプトを使って)データベースの文字コードを「UTF-8」(utf8_general_ci)に変更する例。

How to Convert a Database to UTF-8

<?php    
// convert.php  
// 下記の$db_server,$db_user,$db_password, $db_name, $char_set の値を自分の設定に書き換える。
$db_server = 'localhost';   //通常はこのままでOK
$db_user = 'database user';  // データベースユーザー名を指定
$db_password = 'password';   //パスワードを指定
$db_name = 'database name';   //文字コードを変更するデータベース名を指定
$char_set = 'utf8';  //文字コードを指定(この場合はUTF-8)

// Adds the header information
header('Content-type: text/plain');  

// MySQL database に接続 
$connection = mysql_connect($db_server, $db_user, $db_password) or die(mysql_error() );      
$db = mysql_select_db($db_name) or die( mysql_error() ); 

// クエリを発行し結果を変数に代入     
$sql = 'SHOW TABLES'; $result = mysql_query($sql) or die( mysql_error() ); 

// ループで指定したデータベース内の全てのテーブルの文字コードを変更  
   while ( $row = mysql_fetch_row($result) )   {     
      $table = mysql_real_escape_string($row[0]);  
      $sql = "ALTER TABLE $table CONVERT TO CHARACTER SET $char_set COLLATE utf8_general_ci";     
      mysql_query($sql) or die( mysql_error() );       
      print "$table changed successfully.\n";  
   }    

// データベース自身の 文字コードを変更
$sql = "ALTER DATABASE CHARACTER SET $char_set;";  
mysql_query($sql) or die( mysql_error());     
print "Database collation has been updated successfully.\n";     

//データベース接続を解除  
mysql_close($connection);     

?>

上記スクリプトを実行するには、ブラウザから「http://your-domain.com/convert.php」にアクセスするだけ。(ルート直下にconvert.phpをおいた場合。convert.php を配置したディレクトリによりアドレスは異なる)

データベースを作成した直後の場合(テーブルがまだない場合)は、成功すればブラウザに「Database collation has been updated successfully.」とだけ表示される。

但し、このスクリプトは、パスワードやユーザー名を含むので、使用後は削除する。再利用する場合は、ユーザーがアクセスできない場所に保存する。

パスワードやユーザー名などは、下記のようにして「db_vars.php」というファイルを作成し、外部からアクセスできないディレクトリ「etc」以下などに置くことも可能。この場合も使用後は、削除するか、再利用する場合は、パスワードやユーザー名などの値は削除する。

新しくデータベースを作成して、文字コードを変更する必要があれば、「db_vars.php 」のほうの値を更新して「convert.php」を実行する。

<?php    // db_vars.php この例では「/home/xxxx/etc/db_vars.php」に配置
//それぞれの値を定数として設定  
define('DB_ADDRESS', 'localhost');
define('DB_NAME', 'データベース名');
define('DB_USER', 'データベースユーザー名');
define('DB_PASSWORD', 'パスワード');
?>

convert.php を以下のように変更。

<?php    // convert.php
//require で db_vars.php の値を読み込む
require '/home/xxxx/etc/db_vars.php'; 
$db_server = DB_ADDRESS; 
$db_user = DB_USER; 
$db_password = DB_PASSWORD; 
$db_name = DB_NAME; 
$char_set = 'utf8';
 
//以下は同じ
header('Content-type: text/plain'); 
$connection = mysql_connect($db_server, $db_user, $db_password) or die(mysql_error() );  
$db = mysql_select_db($db_name) or die( mysql_error() );  
$sql = 'SHOW TABLES'; $result = mysql_query($sql) or die( mysql_error() );  
while ( $row = mysql_fetch_row($result) ) 
{ 
  $table = mysql_real_escape_string($row[0]); 
  $sql = "ALTER TABLE $table DEFAULT CHARACTER SET $char_set COLLATE utf8_general_ci"; 
  mysql_query($sql) or die( mysql_error() );
 
  print "$table changed successfully.\n";
} 
$sql = "ALTER DATABASE CHARACTER SET $char_set;";
mysql_query($sql) or die( mysql_error()); 
print "Database collation has been updated successfully.\n"; 
mysql_close($connection);
 
?>

データベースの文字コードを確認するには以下の SQL 文を実行する。

SHOW VARIABLES LIKE "char%";
  • inMotion の場合は cPanel にアクセス。
  • 「Databases」→「phpMyAdmin」で phpMyAdmin を表示して、左側のメニューからデータベースを選択。
  • 上部にある「SQL」のタブを選択して表示されるテキストエリアに上記 SQL 文を記述してクエリを実行。

初期状態では以下のような結果になる。

character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8

convert.php を実行後確認すると以下のようになっている。
(character_set_database が「latin1」から「utf8」に変わっている)

character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8