Zostałem zlecony migracji bazy danych Microsoft SQL Server 2005 do MySQL 5.6 (są to oba serwery bazy danych uruchomione lokalnie) i naprawdę doceniłbym jakąś pomoc.Migracja MSSQL na MySQL - problemy z kodowaniem znaków z parami zastępczymi UCS-2, jak mogę je usunąć z bazy danych MSSQL?
-Zebrane źródło danych MSSQL ma układ łaciński1 (czyli ma ustawiony znak ISO 8859-1?), Ale nie ma żadnych pól char/varchar (dowolne pole łańcuchowe to nvarchar/nchar), więc wszystkie te dane powinny być używane Zestaw znaków UCS-2.
-MySQL docelowej bazy danych chce zestaw znaków UTF-8
postanowiłem użyć zestawu narzędzi migracji bazy danych w najnowszej wersji MySQL Workbench. na początku działało dobrze i migrowało wszystko zgodnie z oczekiwaniami. Ale byłem całkowicie potknięty po napotkaniu znaków zastępczych UCS-2 w bazie danych MSSQL.
Program do kopiowania pakietu narzędzi do migracji nie zawiera bardzo przydatnego komunikatu o błędzie: "Błąd podczas konwersji zestawu znaków w wątku: Brak błędu". Nie dostarczono również żadnych informacji o polu/wierszu danych powodujących problemy i nie powiedzie się w porcjach o rozmiarze 100 wierszy. Po przeszukiwaniu 100 wierszy po ostatnim pomyślnym wstawieniu stwierdziłem, że problem spowodowany był dwoma znakami UCS-2 w jednym z pól nvarchar. Są one wymienione jako pary zastępcze w zestawie znaków UCS-2. Były to w szczególności postacie DBC0 i DC83 (dostałem to, patrząc na dane binarne dla pola i porównując pary bajtów (little endian) z danymi, które były migrowane pomyślnie).
Gdy ta zastępcza para została usunięta z bazy danych MSSQL, wiersz został pomyślnie przeniesiony do MySQL.
Oto problem:
Próbowałem szukać tych znaków w tabeli testowej MSSQL (tabela ta chartest jest tylko różne ciągi testów pola nvarchar) przygotowanie skryptu zastępczą i wciąż otrzymuję dziwne wyniki. .. Muszę robić coś niepoprawnie.
wyszukiwania
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
Wrócimy żadnego zastępczego charakteru pary (czy nie używa DC83), ale oczywiście tylko wtedy, gdy jest to jedyna postać (lub część tej pary) w tej dziedzinie. Nie jest to wielka sprawa, ponieważ i tak chciałbym usunąć dowolną ich instancję (nie lubię usuwać takich danych, ale wydaje mi się, że możemy sobie na to pozwolić).
wyszukiwania
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
Wrócimy każdy wiersz! Niezależnie od tego, czy ma on nawet znak Unicode obecny w polu, nie mówiąc już o postaci DC83. Czy istnieje lepszy sposób na znalezienie i zastąpienie tych postaci? Lub coś innego, co powinienem spróbować?
Próbowałem także ustawić docelowy zestaw danych, tabela i zestaw znaków pola na UCS-2, ale wydaje się, że nie robi różnicy.
Należy również wspomnieć, że migracja ta wykorzystuje dane żywe (~ bazy 50GB!) Podczas jednego z obiektów, który karmi go w tryb offline więc wszelkie rozwiązania tej potrzeby na szybki czas pracy ...
Byłbym wdzięczny za wszelkie sugestie bardzo! Daj mi znać, jeśli są jakieś informacje, które pominąłem.
To się ze mną dzieje, mam tabelkę o nazwie tblSenderRzever - otrzymuję ten sam błąd na tblSenderRzever. W tej tabeli, gdy uruchamiam to zapytanie TYLKO w nvarcharze, dotyczy to 0 wierszy. Czy jest jakiś pomysł, co się dzieje? – maor10
@ user1005978 Celowałem w konkretne postacie, które powodowały u mnie problem. Znalazłem tylko te znaki, przeszukując określoną partię 100 wierszy, w których oprogramowanie migracji się nie powiodło. Czy jesteś w stanie zidentyfikować, które wiersze/pola mają ten problem? Następnie możesz zidentyfikować potencjalnie kłopotliwe postacie (w moim przypadku była to para zastępcza UCS-2 DBC0 i DC83). – JonM