Mi è stato assegnato il compito di migrare un database Microsoft SQL Server 2005 a MySQL 5.6 (questi sono entrambi i server di database runnig localmente) e apprezzerei davvero un po 'di aiuto.Migrazione da MSSQL a MySQL - problemi di codifica del char con coppie di surrogati UCS-2, come posso rimuoverli dal database MSSQL?
-Il database di origine MSSQL ha collazione latin1 (quindi ha il set di caratteri ISO 8859-1 giusto?) Ma non ha campi char/varchar (qualsiasi campo stringa è nvarchar/nchar), quindi tutti i dati devono utilizzare il Set di caratteri UCS-2.
-MySQL database di destinazione vuole il set di caratteri UTF-8
ho deciso di utilizzare il toolkit di migrazione di database nella versione più recente del Workbench MySQL. all'inizio ha funzionato bene e ha migrato tutto come previsto. Ma sono stato totalmente inciampato nell'incontrare i personaggi della coppia surrogata UCS-2 nel database MSSQL.
Il programma di copiatura del programma di copia non ha fornito un messaggio di errore molto utile: "Errore durante la conversione del charset di wstring: nessun errore". Inoltre, non forniva alcuna informazione sul campo/riga sui dati che causavano problemi e falliva in blocchi di 100 righe. Quindi, dopo aver cercato tra le 100 righe dopo l'ultimo inserimento riuscito, ho scoperto che il problema sembrava essere causato da due caratteri UCS-2 in uno dei campi nvarchar. Sono elencati come coppie sostitutive nel set di caratteri UCS-2. Erano specificatamente i caratteri DBC0 e DC83 (ho ottenuto questo osservando i dati binari per il campo e confrontando le coppie di byte (little endian) con i dati che venivano migrati con successo).
Quando questa coppia di surrogati è stata rimossa dal database MSSQL, la riga è stata migrata correttamente su MySQL.
Qui è il problema:
Ho provato a cercare questi personaggi in una tabella di test MSSQL (questa tabella chartest si trova a soli varie stringhe di prova di un campo nvarchar) per preparare uno script di sostituzione e continuo a ricevere strani risultati. .. Devo fare qualcosa in modo errato.
Ricerca di
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
tornerà carattere coppia di surrogati (se utilizza DC83), ma ovviamente, solo se è l'unico carattere (o parte della coppia) in quel campo. Questo non è un grosso problema dal momento che mi piacerebbe rimuovere qualsiasi istanza di questi comunque (non mi piace rimuovere dati come questo ma penso che possiamo permettercelo).
Ricerca di
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
Will return ogni riga! Indipendentemente dal fatto che abbia o meno un carattere unicode presente nel campo, figuriamoci il carattere DC83. C'è un modo migliore per trovare e sostituire questi personaggi? O qualcos'altro dovrei provare?
Ho anche provato a impostare il databse di destinazione, la tabella e il set di caratteri del campo su UCS-2 ma sembra che non faccia la differenza.
Vorrei anche ricordare che questa migrazione sta usando dati in tempo reale (~ database di 50 GB!), Mentre uno dei siti che lo alimenta è presa in linea in modo che qualsiasi soluzione a questa necessità di avere un tempo di esecuzione rapido ...
Apprezzerei molto ogni suggerimento! Per favore fatemi sapere se ci sono delle informazioni che ho omesso.
Questo mi succede, ho una tabella chiamata tblSenderReciever- sto ricevendo lo stesso errore, su tblSenderReciever. In questa tabella, quando eseguo quella query sull'UNO nvarchar, sono interessate le 0 righe. Qualche idea su cosa sta succedendo? – maor10
@ user1005978 Stavo prendendo di mira caratteri specifici che mi causavano un problema. Ho trovato questi caratteri solo ricercando il particolare batch di 100 righe su cui è fallito il software di migrazione. Sei in grado di identificare quali file/campi stanno avendo questo problema? Successivamente è possibile identificare qualsiasi carattere potenzialmente problematico (nel mio caso si trattava in particolare dei caratteri della coppia surrogata UCS-2 DBC0 e DC83). – JonM