2

レプリケーションで 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 として書き込むようにするにはどうすればよいですか?

乾杯

ニック

4

2 に答える 2

0

一般に、スレーブではまったく同じ構成ファイルとバージョンの mysql を使用する必要があります (アップグレード / 移行シナリオ、および server_id などのスレーブで異なる必要があるいくつかのことを除く)。

DB サーバーがソフトウェア展開の一部になるように、データベースのセットアップをスクリプト化する必要があります。非運用環境のデータベース サーバーを含め、すべてのデータベース サーバーがまったく同じ構成を使用することが不可欠です。

構成の同期に失敗すると、予期しないバグが発生します。

異なるサーバーで異なる OS を実行する必要性を感じている理由はわかりませんが、そうすると、運用スタッフの生活がより困難になります。

于 2010-06-15T12:10:25.243 に答える