This post is also available in: English-US (英語)
VPSのLAMP環境で日本語を扱う方法、特に既に作成済みのデータベースの既存テーブルの文字コードを変更する方法についてのメモです。
既にテーブルに大事なデータが入っていたりする場合には、必ずMYSQLのバックアップを取った上で行ってください。
環境は PHP5.6 ubuntu 14.04 です。
Contents
MYSQLに保存された日本語が文字化けしている...
MYSQLに保存された日本語が全て「???」のような感じではてなマーク(エクスクラメーション)に文字化けする現象に遭遇しました。
最初、アプリケーション側かPHPの問題かなと思って、php.ini を編集したりしていたのですが、どうもMYSQLのデフォルトの文字コード(latin1_swedish_ci)の設定変更を忘れていたのが原因のようでした。
以下に、ざっと手順とコマンドをメモ代わりに書いています。
php-mbstringの導入・設定
php-mbstringはマルチバイト文字(日本語とか)を扱うためのPHP拡張モジュールです。
以下は、ubuntuでPHP5の場合のコマンドです。
sudo apt-get install php5-mbstring #もしくはバージョン 5.x の指定で以下のコマンド sudo apt-get install php5.x-mbstring
php-mbstringのインストール後、php.iniの編集を行います。
sudo vi /etc/php5/cli/php.ini
php.iniの編集内容は開発する案件によると思いますが、最低限以下の内容をphp.iniに追加(もしくはコメントアウトを外す)します...と書こうかと思ったのですが、内容がやたら長くなるので、リンク先のサイト様を参照してください。
日本語利用の為の設定(mbstring) | PHPインストールと初期設定
で最後に、忘れずにapacheをリスタートします。
sudo /etc/init.d/apache2 restart
php-mbstringが有効になっているかどうかは、以下のようなPHPスクリプトで確認できますので、作成したファイル(例では phpinfo.php)を、/var/www/html/ に置いてブラウザでアクセスして値を確認します。
/* phpinfo.php */ <?php phpinfo(); ?>
MYSQLデータベースのデフォルトの文字コード変更
MYSQLのデフォルトの文字コード変更の項目ですが、この項目部分を実行しても作成済みの文字コードは変更されません(次の項目で書いてます)。
ですが、デフォルトの文字コード(latin1_swedish_ci)を変更しておかないと、追加でテーブルの追加などを行った際に困る可能性があります。
(ちなみに、utf8_general_ci,utf8_unicode_ci がありますが、日本語中心のシステムの場合 utf8_general_ci にしておく方が無難ぽいです。独立した新しいシステムとして導入する場合には、utf8mb4_general_ci,utf8mb4_unicode_ci も検討に入れるのが良さそうです。)
最初に、MYSQLのオプション設定ファイル(my.cnf)を開き(OSによって場所が違います)、下記のように追加します。
sudo vi /etc/mysql/my.cnf
##my.cnf # [client]の項目の最後に以下を追加 default-character-set=utf8 # [mysqld]の項目の最後に以下を追加 character-set-server=utf8
次に、以下のコマンドでMYSQLにログインし、MYSQLのデフォルトの値を確認します。
mysql -u root -p mysql> show databases; mysql> show variables like "chara%";
で、以下のようなコマンドで、既存データベースの文字コードの設定を変更します(既存データベース内の既存テーブルの文字コードはこれでは変更されません)。
#サンプルDB名:database_name mysql> ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci;
変更後の「mysql> show variables like...」のレスポンスは以下のような感じになっているかと思います。
最後にMYSQLを再起動します。
sudo /etc/init.d/mysql restart
MYSQLの既存テーブルの文字コード変更
以下のコマンドでMYSQLにログインし、databasesの一覧そしてtableの一覧を確認し、テーブルの文字コードの確認を行うことができます。
テーブルの文字コードは「show table status...」コマンドで出てくる「 Collation 」の欄で確認できます。
mysql -u root -p #サンプルDB名:database_name, サンプルテーブル名:table_name mysql> show databases; mysql> USE `database_name`; mysql> show tables from database_name; mysql> select * from table_name; mysql> show table status from database_name like 'table_name';
そして、以下のようなコマンドで文字コードを変更したい既存テーブルを指定して、文字コードを変更します。
#サンプルテーブル名:table_name mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
※MYSQLの既存テーブルの文字コードを一括で変更したい場合
既存テーブルの数が手作業では多すぎる場合に、以下のように一括でコマンドを生成できます(生成だけで実行していない)。
以下のコードは、コマンドを生成しているだけで実行しているわけではありませんので、出力された結果をテキストエディタの文字列置換(\| を空文字に変換とか)とかで適宜編集して、実行してください。
#サンプルDB名:database_name mysql> SELECT CONCAT('ALTER TABLE `', tbl.`TABLE_SCHEMA`, '`.`', tbl.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM `information_schema`.`TABLES` tbl WHERE tbl.`TABLE_SCHEMA` = 'database_name';
最後に忘れずにMYSQLを再起動します。
sudo /etc/init.d/mysql restart