さくらレンタルサーバ phpMyAdminでのエクスポート文字化け対処法

2016年01月12日

「さくらのレンタルサーバ スタンダード」から「さくらのマネージドサーバ」への移行作業をした。

その際に、phpMyAdminを利用してMySQLに接続し、データのエクスポート→移転先サーバでのインポートを試みたところ、移転先サーバで文字化けしてしまった。
文字エンコーディングはどちらもUTF-8 (utf8_general_ci) にしてあるにもかかわらず。
結論としては「phpMyAdminだけでなく、コマンドラインを使ってデータを取り出す」方法で無事に移行できたものの、2時間ぐらいハマってしまった。

【免責】やったらできたよ、というレポートにつき、推奨されない方法かもしれない。参考にする場合は、転ばぬ先のバックアップ/対策を…。

そもそもphpMyAdmin上のレコード表示が文字化けしている

phpMyAdmin上でテーブルのレコードを参照した際に、すでに文字化けが起きており、何が書いてあるか読めない状態だった。
ウェブサーバ上に置いていたPHPプログラムからは文字化けなしで読み書きできていたので、実際の運用上は問題なく、今まで文字化けに気づかなかった。

このため、phpMyAdminのエクスポート機能を利用した際も、dumpファイルの日本語部分が文字化けしてしまっていた。

いろいろとphpMyAdmin上から文字コードを変えられないか見たものの、解決の糸口が見つからなかった。

phpMyAdminがダメなら、SSH接続でdumpすればいいじゃない

さくらのレンタルサーバはTerminal(コマンドライン)から接続することができる。
phpMyAdminからうまく接続できない、もしくは表示できないのであれば、中のデータベースに直接アクセスしてしまえば良いと考えた。

さくらのレンタルサーバにSSH接続する

さくらのレンタルサーバでは、セキュリティ上、さくらのサーバ内からのみSQLサーバへの接続を受け付ける設定になっている。
MacのTerminalで接続する場合、下記のコマンドを打ち込んだあと、FTPパスワードを入力することでログインできる。

[plain highlight="2"]
# MacのTerminalで接続する場合
ssh -2 【さくらユーザ名】@【さくらユーザ名】.sakura.ne.jp
[/plain]

MySQLデータをFTP領域に取り出す

下記のコマンドを打ち、今度はMySQLのログインパスワードを入力することで、MySQLサーバに接続できる。
今回の場合は、MySQL上での文字コードが(初期設定上?)'latin1'として認識されてしまっていることによるものだったので、「latin1」を指定した。
これで、出力されるdumpファイルの文字化けが解消した。

[plain highlight="4"]
# mysqlXXX.db.sakura.ne.jpの部分は、各々のSQL接続先サーバに合わせて変更する。さくらレンタルサーバのコントロールパネルからも確認出来る。
# dumpファイルの出力先は、FTPで接続できる領域にしておく。
# 例:/home/USERNAME/www/dump.sql
mysqldump --default-character-set=latin1 -h mysqlXXX.db.sakura.ne.jp -u 【ユーザ名】 -p 【データベース名】 > 【出力先】;
[/plain]

取り出したデータをローカルにダウンロードする

先ほどのダンプファイルを、FTPソフトなどでローカルにダウンロードする。
mi等のテキストエディタで開き、(データ量によっては開くのに時間がかかるかもしれない)、文字化けしていないことを確認する。

ダンプファイルに小細工する

取り出したダンプファイルをそのまま移転先のphpMyAdminにインポートさせると、文字化けしてしまう。
そこでダンプファイルに小細工をする。
テキストエディタで開き、下記のように、10行目付近にあるSET NAMESのlatin1をutf8に変更し、保存する

[plain]
/*!40101 SET NAMES latin1 */;
[/plain]

[plain]
/*!40101 SET NAMES utf8 */;
[/plain]

ダンプファイルを移転先でインポートする

ここまでできれば、あとは移転先のサーバにあるphpMyAdminの「インポート」から先ほどのダンプファイルをアップロード(実行)するだけ。
移転先のサーバでphpMyAdminを見ても、レコードは文字化けせず、他のPHPプログラムからも問題なく利用できた。

一言

もっとスマートかつ根本的に対処する方法もありそうなものだが、レンタルサーバという制約上、MySQLの設定ファイルmy.cnfが読取専用にされていたり、プリインストールされているphpMyAdminの設定も深くいじれないようなので諦めることにした。