6

非常に大きなMySQLデータベース(1.6GB-ほとんどがBLOB)をエクスポートして、新しいサーバーにインポートしようとしています。私はほとんどの問題を解決し、最終的にエラーなしでインポートを完了しました。MySQLクエリブラウザを使用して、画像のBLOBを含むテーブルでクエリを実行し、ディスクに保存しました(クエリブラウザの保存アイコンを使用)。ファイルを開こうとすると、「画像形式が無効です」というエラーが表示されました。ええとああ。

クエリブラウザを使用して、ソースデータベースと最近インポートされた新しいデータベースの値を調べました。値が違うと思います。エンコーディングの問題か何かである可能性があります。これが私が見るものです:

ソース(有効なデータ)サーバー:

FF D8 FF E0    00 10 4A 46    49 46 00 01    01 01 00 60
00 60 00 00    FF DB 00 43    00 08 06 06    07 06 05 08
and so on...

新しいサーバー:

C3 BF C3 98    C3 BF C3 A0    00 10 4A 46    49 46 00 01
01 01 00 60    00 60 00 00    C3 BF C3 9B    00 43 00 08
and so on...

この例では、初心者の目には、「新しい」サーバーのデータの前に3バイトの余分なデータがあるように見えます。

次に、 010エディターを使用してSQLダンプファイルをチェックアウトしました。私はこの特定の例の行を見つけました、そしてここに私が見るものがあります:

FF D8 FF E0    5C 30 10 4A    46 49 46 5C    30 01 01 01
5C 30 60 5C    30 60 5C 30    5C 30 FF DB    5C 30 43 5C
30 08 06 06    07 06 05 08    and so on...

今、私は頭を抱えています。パターンが表示されます。HEXペア5C30が00と同じように見えるのに気づきましたが、その理由がわかりません。この時点で、ワイプされようとしているソースサーバーがあり、新しいサーバーに破損したデータがインポートされているのではないかと心配しています。これがMySQLでグローバル変数を設定することで解決できるある種のエンコーディングの問題であることを願っていますが、私は本当に知りません。

また、ソース(動作中の)サーバーと新しい(破損した)サーバーからファイルを保存すると、破損したファイルのファイルサイズが約40%大きくなることにも言及する必要があります。

両方のサーバーで文字セット変数を確認しました。

SHOW VARIABLES LIKE '%char%'

ソースサーバー:

character_set_client      utf8
character_set_connection  utf8
character_set_database    latin1
character_set_filesystem  binary
character_set_results     utf8
character_set_server      latin1
character_set_system      utf8

新しいサーバー:

character_set_client      utf8
character_set_connection  utf8
character_set_database    latin1
character_set_filesystem  binary
character_set_results     utf8
character_set_server      latin1
character_set_system      utf8

それらは同じです。

4

1 に答える 1

6

新しいデータベースからの破損したデータは、ソースデータをISO‑8859‑1からUTF‑8に変換した結果のように見えます(たとえば、U + 00FF —ÿ—FFは前者とC3 BF後者にあります)。

BLOBには文字セットがないため、文字エンコードはサーバー変数によって制御されません。mysqldumpBLOBデータをUTF-8でエンコードされたファイル(デフォルト)に出力していると思われます。サーバー設定とに渡されたオプションの組み合わせによって、途中でエンコードされていますmysqldump

最善の解決策は、--hex-blobBLOBフィールドをエクスポートするときにこのオプションを使用することです。これにより、次のようになります。

INSERT INTO `table` VALUES (0xFFD8FFE0...);
于 2012-12-02T23:42:14.277 に答える