Имам задача да мигрирам база данни на Microsoft SQL Server 2005 към MySQL 5.6 (и двата сървъра на база данни работят локално) и наистина ще оценя малко помощ.
-MSSQL изходната база данни има latin1 сортиране (така че има ISO 8859-1 символен набор нали?), но няма полета char/varchar (всяко поле за низ е nvarchar/nchar), така че всички тези данни трябва да използват знака UCS-2 комплект.
- Целевата база данни на MySQL иска набора от знаци UTF-8
Реших да използвам инструментариума за мигриране на база данни в най-новата версия на MySQL workbench. в началото работи добре и мигрира всичко според очакванията. Но бях напълно объркан, когато се натъкнах на UCS-2 сурогатни двойки знаци в базата данни MSSQL.
Програмата за копиране на инструментариума за миграция не предостави много полезно съобщение за грешка: „Грешка по време на преобразуване на набор от символи на wstring: Няма грешка“. Той също така не предостави никаква информация за поле/ред за причиняващите проблем данни и би се провалил в рамките на части от 100 реда. Така че след търсене в 100-те реда след последното успешно вмъкване открих, че проблемът изглежда е причинен от два знака UCS-2 в едно от полетата nvarchar. Те са изброени като заместващи двойки в набора от символи UCS-2. Те бяха по-конкретно символите DBC0 и DC83 (разбрах това, като разгледах двоичните данни за полето и сравних двойки байтове (little endian) с данни, които бяха мигрирани успешно).
Когато тази сурогатна двойка беше премахната от MSSQL базата данни, редът беше мигриран успешно към MySQL.
Ето го проблема:
Опитах се да потърся тези знаци в тестова MSSQL таблица (тази таблица с диаграми е просто различни тестови низове поле nvarchar), за да подготвя заместващ скрипт и продължавам да получавам странни резултати... Сигурно правя нещо неправилно.
Търся
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
Ще върне всеки сурогатен знак за двойка (независимо дали използва или не DC83), но очевидно само ако е единственият знак (или част от двойката) в това поле. Това не е голяма работа, тъй като така или иначе бих искал да премахна всеки екземпляр от тях (не искам да премахвам данни като тези, но мисля, че можем да си го позволим).
Търся
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
Ще се върне всеки ред! Независимо дали дори има символ на unicode в полето, да не говорим за знака DC83. Има ли по-добър начин да намерите и замените тези знаци? Или нещо друго, което трябва да опитам?
Също така се опитах да задам целевата база данни, таблица и набор от символи на полето на UCS-2, но изглежда, че това няма значение.
Трябва също така да спомена, че тази миграция използва живи данни (~50 GB база данни!), докато един от сайтовете, които я захранват, е офлайн, така че всички решения за това трябва да имат бързо време за изпълнение...
Ще се радвам много на всякакви предложения! Моля, уведомете ме, ако има някаква информация, която съм пропуснал.