2008-11-18 6 views
0

J'essaie d'importer un gros fichier SQL; créé par mysqldump sur un serveur, puis converti avec iconv; l'utilisation de ces commandes:MySQL ne conserve pas les informations sur les caractères lors de l'importation

$ mysqldump -uxxx -p xxx > data.sql 
$ iconv -f UTF-8 -t ISO-8859-1//TRANSLIT data.sql data.iconv.sql 

je remarquai que le "\ x91" dans la base de données avait transformé en "\ xc3 \ x82 \ xc2 \ x91" dans la décharge, parce que mysqldump essaie de convertir tout en utf-8. Je l'ai converti en "\ x91" avec iconv. Si je ne les convertis pas, ils finissent par être "\ xc2 \ x3f" sur le nouveau serveur; au lieu de juste "\ x3f" comme nous l'avons maintenant. Donc, comme nous l'avons déjà vu, il existe des caractères propres au codage cp1252, par exemple "\ x91" et "\ x92". Ces deux caractères sont devenus "\ x3f" dans la nouvelle base de données; c'est la commande que j'utilise pour importer:

$ /opt/mysql5/bin/mysql -uxxx -p -Dxxx < data.iconv.sql 

Quelqu'un sait comment cela peut arriver et que faire pour l'empêcher? Sachant cela, je devrais pouvoir migrer les données exactement comme elles l'étaient.

Informations supplémentaires:

J'utilisé this source pour les iconv-choses. Comme vous pouvez le voir, sur cette page, une autre personne a également eu des problèmes avec cp1252; peut-être que c'est la cause.

Les serverversion sont:

ancien hôte: Ver 10,10 Distrib 5.0.18, pour pc-linux-gnu (i486) nouveau-hôte: Ver 10,11 Distrib 5.0.51, pour pc-linux-gnu (i686)

Répondre

0

Si vos données sont cp1252, pourquoi dites-vous à iconv son utf-8?

+0

Mentionné que dans la question d'origine; Si ce n'est pas le cas, mysqldump génère \ xc2 \ x91 au lieu de \ x91. Je crois avoir lu sur la même page que cette solution que mysqldump essaie de tout convertir en utf-8. Dans ce cas, à tort –

0

Je n'ai toujours pas trouvé de solution de travail; nous allons essayer de migrer à l'aide d'un script qui fait 2 connexions et sélectionne simplement d'une connexion et met à jour l'autre ...

-1

Essayez: -

iconv -f IBM-1252 ISO-t 8859- 1

Je ne sais pas pourquoi ma réponse précédente a été marquée vers le bas. utf-8 n'est pas ASCII! Tous les caractères utf 7 bits sont identiques au jeu de caractères ASCI 7 bits, mais le premier bit b'1000000 'a une signification spéciale en UTF-8 et indique que le caractère est un caractère unicode deux trois ou quatre octets.

+0

ce n'est pas un forum. si vous avez d'autres idées, éditez votre première réponse – hop

0

Si MySQL convertit à utf-8 alors vous voulez:

iconv -f utf-8 -t IBM-1252 xxxx 

Cela devrait convertir la citation ouverte retour à x "91". Le "xc291" est vraiment utf-8 pour un devis ouvert.

0

Quelle version de mysqldump utilisez-vous?

version récente table wrap 5 libère des décharges avec des commandes qui définissent le jeu de caractères, par exemple:

SET @saved_cs_client  = @@character_set_client; 
SET character_set_client = utf8; 

CREATE TABLE ... 
... 
... 
SET character_set_client = @saved_cs_client; 

pourrait la présence/absence de ceux-ci affecter votre importation?

+0

Répondez à votre question dans le message principal! –

1

Sur mon système, mysqld sauvegarde par défaut les données dans latin1 avec le classement suédois. De même, le client de ligne de commande mysql utilise par défaut des données dans latin1. mysqldump, d'autre part, par défaut utf-8.Cela provoque des problèmes lors de l'exportation de données via mysqldump, puis l'importation à l'aide du client de ligne de commande mysql - les caractères qui ne sont pas communs aux deux jeux de caractères sont mutés.

La solution est d'obtenir mysqldump pour décorer les données avec des commandes supplémentaires qui fixeront correctement les clients mysql jeu de caractères:

mysqldump --set-charset ... 

Cette volonté, par défaut, ajouter « set name = utf-8 » dans les données sous-évaluées. Cela peut maintenant être importé proprement par le client mysql.

L'option supplémentaire "--default-character-set=xxx" peut être utilisée avec mysqldump pour convertir la sauvegarde en autre chose que utf-8.

En utilisant l'option -set-charset devrait vous éviter d'avoir à utiliser iconv du tout.

Questions connexes