データベースの文字コード

cronでデータベースのバックアップを実施していますが、そのバックアップからリストアした際に文字化けが発生したので、データベースの文字コードについて記載しておきます。

さくらインターネットのレンタルサーバサービスが前提です。他社やさくらインターネットの他のサービスの場合は異なります。

データベースサーバは、MySQL 5.1.51で文字コードセットはEUC(ujis)になっています。(デフォルトのバージョンを使用した場合)
PHPは、ver5.2.17がデフォルトです。
phpmyadminは、ver3.3.7です。

※Drupalの要件ではデータベースの文字コードセットはUTF-8です。

関連アプリケーション情報
アプリケーション名 使用可能バージョン INSTALL_DIR サーバ名または接続先サーバ名
MySQL 5.1.51 、(4.0) /usr/local/mysql/バージョン番号 mysqlnnn.db.sakura.ne.jp(データベースサーバ)
PHP (4.4.9)、5.2.17、(5.3.6) /usr/local/php/バージョン番号 wwwnnn.sakura.ne.jp(レンタルサーバ)
Apache 1.3.42 /usr/local/apache/バージョン番号 wwwnnn.sakura.ne.jp(レンタルサーバ)
mysql Ver 14.14
Distrib 5.1.30
/usr/local/bin wwwnnn.sakura.ne.jpからmysqlnnn.db.sakura.ne.jpに接続
mysqldump Ver 10.13
Distrib 5.1.30
/usr/local/bin wwwnnn.sakura.ne.jpからmysqlnnn.db.sakura.ne.jpに接続
phpmyadmin 3.3.7 専用Webサーバ上(詳細不明) https://secure.sakura.ad.jp/phpadmin2にアクセスし、mysqlnnn.db.sakura.ne.jpへ接続
※「mysql」「mysqldump」「phpmyadmin」はクライアントプログラム

オプションの読み込み
設定ファイルの読み込み順序は以下の通りで、重複する項目については後に読み込んだ方で上書きされていきます。
①インストールディレクトリの設定ファイル(INSTALL_DIR/etc やlib以下、/etc以下など)
②$HOME以下
③プロセス起動時のオプション
※実際にはソースからコンパイルする際のconfigureに左右されます。
そもそもユーザ権限ではサーバプロセスに対してどうこうできませんので、影響するのはユーザが使用できるクライアントプログラムのみです。

設定ファイル
アプリケーション名 設定ファイル ユーザ個別設定ファイル
MySQL 以下の順序で検索
(①/etc/my.cnf)
(②/etc/mysql/my.cnf)
③【INSTALL_DIR】/etc/my.cnf
(④【INSTALL_DIR】/etc/mysql/my.cnf)
※()はレンタルサーバ内には存在しなかったもの
~/.my.cnf

※~はデータベースサーバのmysqldを起動する管理者権限のあるユーザのホームディレクトリ、レンタルサーバ上の一般ユーザではサーバプロセスを起動できないので無意味
PHP 【INSTALL_DIR】/etc/pear.conf
/usr/local/etc/php/extensions.ini
【INSTALL_DIR】/lib/php.ini
【DocumentRoot】/php.ini

※マルチドメインの場合は【DocumentRoot】/パス名/php.ini
Apache 【INSTALL_DIR】/httpd.conf 【DOCUMENT_ROOT】以下の.htaccess
mysql /usr/local/mysql/5.1/etc/my.cnf $HOME/.my.cnf
mysqldump /usr/local/mysql/5.1/etc/my.cnf $HOME/.my.cnf
phpmyadmin 【INSTALL_DIR】/config/config.default.php $HOME/.config.ini.php
※デフォルトのパスや使用する設定ファイルの指定方法などに関する正確な情報は、それぞれのリファレンスマニュアルを参照してください。
※phpmyadminは、データベースサーバに導入されていると思われるので、phpmyadmin関連の設定(config.default.phpconfig.ini.phpなど)はmysqlnnn.db.sakura.ne.jp内にあるはず。


MySQLクライアントからみた場合
※mysqlコマンドは対話型のクライアントプログラムです。
mysql> show variables like 'character_set%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | ujis                             |
| character_set_connection | ujis                             |
| character_set_database   | ujis                             |
| character_set_filesystem | binary                           |
| character_set_results    | ujis                             |
| character_set_server     | ujis                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

mysql>


phpmyadmin2クライアントからみた場合
drupal_2011062902

参考:文字コードセットとそのデフォルト照合順序
drupal_2011062901

参考:変数名(Variable Name)について
Variable Name Default 説明
character_set_client ujis クライアントから送られるステートメントの文字コードセット
character_set_connection ujis サーバでクエリを処理した後に変換される文字コードセット
character_set_database ujis デフォルトのデータベースの文字コードセット。
データベース、テーブル、カラム定義で個別に指定可能。
character_set_filesystem binary ファイル名などファイルシステムの解釈に使われる文字コードセット。
binaryは自動変換を抑止する意味もあり無変換。
character_set_results ujis サーバから結果セットやエラーメッセージをクライアントへ送る前に変換する文字コードセット
character_set_server ujis サーバの文字コードセットでサーバプロセス(mysqld)起動時に指定可能。指定しない場合はlatin1になる。
character_set_system utf-8 メタデータ(データベースの説明)用の文字コードセットで一致していなければSHOWコマンドやSELECTステートメントが正確に動作しない
character_sets_dir /usr/local/share/mysql/charsets 文字コードセットをインストールしたディレクトリ
※デフォルト値はコンパイル時の設定に左右されます。
※上表のデフォルトはさくらインターネットのレンタルサーバの場合です。通常のデフォルトはlatin1になります。
※ユーザ個別設定はホームディレクトリ直下の「.my.cnf」ファイルで可能ですが、「character_set_server」や「character_set_database」はサーバの設定ですので管理者権限がなければサーバプロセスの再起動ができませんので変更はできません。
※レンタルサーバ(SSHでリモートログインするサーバ)上にデータベースサーバがあるわけではありません。それぞれサーバ名(IPアドレス)が異なるはずです。

基本的には、文字コードがことなるとそれぞれの間で文字コードは自動変換されます。
この変換に使用されるライブラリはMySQLに実装されているものが使われるようですので、nkfなどのツールの結果とは異なる可能性があります。
その際にlatin1からutf-8やujisなどに変換される際には文字の破壊が発生するケースもあるようです。

リストアすると文字化けが発生
バックアップはmysqldumpコマンドを使用して自動取得しています。
オプションに「default-character-set=utf8」を指定しており、PC上にダウンロードしてエディタ(UTF-8)で閲覧しても文字化けはありません。
しかし、このファイルを編集して(文字コードはそのまま)mysqldumpコマンドでリストア(インポート)すると文字化けが発生します。
文字化けはphpmyadminクライアント上のテーブル内のデータ表示およびブラウザで記事内容を表示した場合に発生しています。

ためしに、バックアップファイルを編集した後、EUCに変換してからmysqldumpコマンドでリストアした場合は文字化けは発生しませんでした。
となると、現状のバックアップファイルはそのままリストアできない。となってしまいます。
これではバックアップファイルとしてはいまいちです。
さらに、mysqldumpコマンドでバックアップしたファイルは、phpmyadminツールからインポートするとtoo longのようなエラーでインポートはできません。
phpmyadminツールでは一度に多くのデータをインポートできないためです。

mysqldumpコマンドでバックアップを取得するとデフォルトでutf8になってしまうようです。
なので、binaryで取得するようにすれば文字コード変換を途中でする必要もなくうまくいきそうに思いますが、まだ確認がとれていません。

仕事でいろいろな客先のバックアップ設計をみますが、そのバックアップデータを使って実際にリストアしたことがない・・・
そんなところばかりで、日々バックアップしているデータは気休めだけでしかないといったようです。
どの時点に戻すのが最善なのかもシステムで異なりますし、顧客の要望しだい変わってきます。
設計の段階でその説明がされ承諾を得ている現場は非常に少なく感じました。
システム変更に対応できていないというところも多いみたいです。
特にデータベースのオンラインバックアップを取得する場合はどの状態にもどせるのかは重要なポイントだと思います。

一度、何のためのバックアップなのかを明確にしてバックアップ設計自体見直したほうが良いのかもしれません。

Drupalバージョン

サイト管理

カテゴリ

管理