私は、Microsoft SQL Server 2005 データベースを MySQL 5.6 に移行する任務を負っています (これらはどちらもローカルで実行されているデータベース サーバーです)。
-MSSQLソースデータベースにはlatin1照合があります(ISO 8859-1文字セットは正しいですか?)が、char/varcharフィールドがないため(文字列フィールドはnvarchar/ncharです)、このデータはすべてUCS-2文字を使用する必要があります設定。
-MySQL ターゲット データベースは文字セット UTF-8 を必要とします
MySQL ワークベンチの最新バージョンでデータベース移行ツールキットを使用することにしました。最初は問題なく動作し、すべてが期待どおりに移行されました。しかし、MSSQL データベースで UCS-2 サロゲート ペア文字に遭遇したとき、私は完全につまずきました。
移行ツールキットの copytable プログラムは、「wstring の文字セット変換中にエラーが発生しました: エラーはありません」という有用なエラー メッセージを提供しませんでした。また、問題の原因となったデータに関するフィールド/行情報も提供せず、100 行のチャンク内で失敗しました。そのため、最後に挿入が成功した後に 100 行を検索したところ、nvarchar フィールドの 1 つにある 2 つの UCS-2 文字が問題の原因であることがわかりました。これらは、UCS-2 文字セットのサロゲート ペアとしてリストされています。それらは具体的には文字 DBC0 と DC83 でした (これは、フィールドのバイナリ データを見て、バイト ペア (リトル エンディアン) と正常に移行されたデータを比較することでわかりました)。
このサロゲート ペアが MSSQL データベースから削除されると、行は MySQL に正常に移行されました。
問題は次のとおりです。
これらの文字をテスト MSSQL テーブル (この chartest テーブルはさまざまなテスト文字列と nvarchar フィールドです) で検索して、置換スクリプトを準備し、奇妙な結果を得ようとしました...何か間違ったことをしているに違いありません。
探している
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
任意のサロゲート ペア文字 (DC83 を使用するかどうかにかかわらず) を返しますが、明らかに、それがそのフィールド内の唯一の文字 (またはペアの一部) である場合に限ります。とにかくこれらのインスタンスを削除したいので、これは大したことではありません (このようなデータを削除するのは好きではありませんが、余裕があると思います)。
探している
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
すべての行を返します!DC83文字はもちろん、フィールドにUnicode文字が存在するかどうかに関係なく。これらの文字を見つけて置き換えるより良い方法はありますか? または、他に試してみるべきことがありますか?
また、対象のデータベース、テーブル、およびフィールドの文字セットを UCS-2 に設定しようとしましたが、違いはないようです。
また、この移行ではライブ データ (最大 50 GB のデータベース!) を使用していますが、それをフィードするサイトの 1 つがオフラインになっているため、これに対するソリューションには迅速な実行時間が必要です...
提案をいただければ幸いです。抜けている情報があれば教えてください。