inMotion でデータベースを作成する際は、「cPanel」の「MySQL Database Wizard 」などで作成するため、「phpMyAdmin」の「データベース」→「データベースを作成する」で「照合順序」を指定して作成することができない。
このため、データベース作成後、必要であれば文字コードを変更する。
下記のスクリプト(convert.php)を作成し、適当なディレクトリにアップロードして、スクリプトを実行すると、指定したデータベースの文字コードを変更できる。
追加情報
2013年9月4日
本日データベースを追加する際に、「MySQL Database Wizard 」でデータベースを作成後、「phpMyAdmin」で作成したデータベースを選択し、上部のタブの「操作」をクリックすると、以下のような画面が表示された。
初期状態では文字コードは「latain1_swedish_ci」になっている。
ここの「照合順序」で文字コードを設定できるので、プルダウンから「utf8_general_ci」を選択して「実行」をクリック。
以前 inMotion に問い合わせたときは、スクリプトを使って変更する方法を教えてもらったが、こちらの方が簡単。
上記の方法が使えない場合は以下のような方法もある。
以下は(スクリプトを使って)データベースの文字コードを「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%";
初期状態では以下のような結果になる。
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