MT6用のMySQLデータベース(mt6db)の内容が文字化けしていた。サーバでデータベースを作成したときの初期値(my.cnf設定)で、文字コードが "latin1_swedish_ci"になっていたためである。過去に何度か文字化けが発生し、それを修復して学習したはずだが、数年も経つとすっかり忘れてしまっていた。
サーバと照合順序とMT6のデフォールト文字コード
MT5以後、文字コードはUTF-8がデフォールトになった。昔は、mt-config.cgiにcharacterset, mbstring, namesなどを設定することがあったが、今は無関係である。すべてUTF-8で処理される。一方、サーバのMySQLで扱う文字コードはmy.iniやmy.cnfで設定する。
共有レンタルサーバでは、ユーザはMySQL初期設定(システム全体)を変更することができない。個々のデータベースの文字コードは、phpMyAdminの「照合順序」で設定する。Hostmonster, Bluehostなど多くのWebサーバでは、新規にデータベースを作成したときの文字コードは、なぜかlatin1_swedish_ciになっている。
MySQL5.5.xでは、「サーバ接続の照合順序」は "utf8mb4_general_ci" になっており、サーバの文字セットもUTF-8 Unicode (utf8)になっている。しかし、新しく作ったテーブルの文字コードはすべてlatin1_swedish_ciになる。一方、MTはutf8で書き込むので、初期設定時の照合順序(latin1_swedish_ci)のままだと文字化けになってしまうというわけだ。
MT管理画面では、utf8で書き込みutf8で読んでいるので文字化けしない。phpMyAdminで読めるようにするためには、すべてのテーブルの照合順序をutf8(utf8_general_ci)にしなければいけない。厄介なことに、一度latin1_swedish_ciで作成されたテーブルは、phpMyAdmin操作で照合順序をutf8に変更しても文字化けは解消されない。それどころか、utf8に変更すると、今度はMT管理画面が文字化けする。
latin1からutf8に変換する手順
ネットで同じような問題に直面した人が書いた情報(下記参考リンク)を調べ、あれこれ試してやっと解決できた。修正手順を下記にメモしておく。※アップロード時のエラーも発生(下記参照)
- phpMyAdminを使ってデータベースをエクスポートする。
圧縮ファイル(zipまたはgzip)でダウンロードしたときは、これを展開する。 - 展開したファイルをNotepad++、秀丸などのテキストエディターで開く。
MKEditorはファイルサイズが大きい(10MB以上)とメモリー不足のエラーになる。 - 秀丸(期間限定で無料試用)の場合、エンコードの種類を「欧文(西ヨーロッパ言語)」にして別の名前で保存する。「文字コード変換できない文字が含まれます」という警告が表示されるが、かまわずに保存する。保存したファイルを再度開くと文字化けが解消されている。
- このファイル(sqlテキスト)の中の、「CHARSET=latin1;」をすべて「CHARSET=utf8;」に変更して、上書き保存する。
- 変更後のファイルを50MB以内に圧縮して、phpMyAdminでインポートする。
※インポートする前に、データベースの照合順序が utf8_general_ciになっていることを確認する。 - MT6のmt-config.cgiの中の接続するデータベース名を、インポートしたデータベースの名前に変更する。
以上の作業を完了後は、MT管理画面もphpMyAdminも文字化けがなくなる。先に書いたように、照合順序がlatin1_sweden_ciのままでも機能するが、サーバやドメインを移行するときに文字化けが発生してしまうので、前もってすべてutf8に修正しておいたほうが良い。
phpMyAdminインポート中にSQL Syntax Error発生
大きなファイルを圧縮(例:68MB→7.5MB)してアップロードすると、#1064のエラーになって処理が中断された。ファイルが大きいと、SQL処理途中で転送が中断して、Syntax Errorになることがある。sql dumpを小さく分割してアップロードすると解決する。
utf8とutf8mb4
MySQL5.5以降からutf8mb4がサポートされた。utf8は文字当り3バイトだが、utf8mb4では4バイト使用する。つまり4バイト文字に対応できるようになった。通常、日本語漢字ではutf8で十分で、4バイトの特殊文字も扱える(未確認)そうだ。
Hostmonsterのサーバ接続の照合順序のデフォールトが utf8mb4_general_ci になっており、共用サーバの場合、phpMyAdminから変更できない。データベースおよびテーブルを作成するときに文字コードを設定(変更)する必要がある。データベース作成時の文字コードのデフォールトはlatin1なので注意が必要だ。
Hostmonsterデータベースサーバ
- サーバ: Localhost via UNIX socket
- サーバの種類: Percona Server
- サーバのバージョン: 5.5.42-37.1-log - Percona Server (GPL), Release 37.1, Revision 2
- プロトコル バージョン: 10
- ユーザ: cpses_syQnqjamR6@localhost
- サーバの文字セット: UTF-8 Unicode (utf8)
- phpMyAdmin バージョン情報: 4.3.8, 最終安定バージョン: 4.6.3
参考リンク
- phpMyAdminで文字化けしたデータの修正方法
- phpMyAdminの日本語文字化け
- phpMyAdminが文字化けする
- phpMyAdmin で文字コードの確認(文字化け対策)
- Movable TypeのMySQL設定
- Movable Typeでデータベースの文字化け
- Movable Type の管理画面が文字化け
- Migrating MySQL latin1 to utf8
- SOLVED!SQL error when import database (Posted 20 June 2016 - 08:37 AM)
- syntax error on import mysql
- When are we supposed to set default-character-set for the client?
- SQL Syntax; What is this? (/*!40101 SET NAMES utf8 */;などの意味)
- Character Sets and Collations Supported by MySQL 5.5
- 文字セットと照合順序