レプリケーションで utf-8 の代わりに latin1 が使用されるようにするにはどうすればよいですか?
Linux システム上の MySQL 5.1.22 サーバー (マスター) と FreeBSD システム上の MySQL 5.1.42 サーバー (スレーブ) の間で移行しています。私のレプリケーションはうまくいきますが、ASCII 以外の文字が varchars にあると、それらは「変」になります。Linux/MySQL-5.1.22 は、次の文字セット変数を示しています。
character_set_client=latin1
character_set_connection=latin1
character_set_database=latin1
character_set_filesystem=binary
character_set_results=latin1
character_set_server=latin1
character_set_system=utf8
character_sets_dir=/usr/share/mysql/charsets/
collation_connection=latin1_swedish_ci
collation_database=latin1_swedish_ci
collation_server=latin1_swedish_ci
FreeBSDが表示されている間
character_set_client=utf8
character_set_connection=utf8
character_set_database=utf8
character_set_filesystem=binary
character_set_results=utf8
character_set_server=utf8
character_set_system=utf8
character_sets_dir=/usr/local/share/mysql/charsets/
collation_connection=utf8_general_ci
collation_database=utf8_general_ci
collation_server=utf8_general_ci
MySQL CLI からこれらの変数を設定しても効果はなく、my.cnf またはコマンド ラインでこれらの変数を設定すると、サーバーが起動しなくなります。
もちろん、どちらのサーバーにも問題のテーブルが同じ方法で作成されています。この場合は、DEFAULT CHARSET=latin1 を使用しています。例を挙げましょう:
CREATE TABLE `test` (
`test` varchar(5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
マスターで、Latin1 端末で「INSERT INTO test VALUES ('æøå')」を実行すると、Latin1 ベースの端末から選択すると、これがスレーブになります。
+--------+
| test |
+--------+
| æøå |
+--------+
レプリケーション スレーブの UTF-8 ベースの端末では、test に以下が含まれます。
+--------+
| test |
+--------+
| æøå |
+--------+
したがって、テーブル定義がlatin1であっても、utf8に変換されるというのが私の結論です。これは正しい結論ですか?
もちろん、マスターの latin1 端末では、次のように表示されます。
+------+
| test |
+------+
| æøå |
+------+
両方のシステム文字セットが utf-8 であるため、両方の端末を utf-8 に設定し、utf-8 端末を使用するマスターで「INSERT INTO test VALUES ('æøå')」を再度実行すると、utf-8 を使用するスレーブで私は得る:
+------------+
| test |
+------------+
| æøà |
+------------+
私の結論が正しければ、レプリケートされたすべてのデータは utf8 に変換され (utf8 の場合は、latin1 として扱われ、utf8 に変換されます)、CREATE TABLE が示唆するように、テーブル内のすべての古いデータは latin1 になります。レガシーアプリケーションがlatin1に依存しているという事実がなければ、すべてをutf-8に変換したいので、それらがまだ存在している間はlatin1のままにしておく必要があります。
レプリケーションが latin1 を読み取り、latin1 として扱い、スレーブに latin1 として書き込むようにするにはどうすればよいですか?
乾杯
ニック