Comment résoudre la séquence d'octets non valides UTF8 erreurs de copie sur une restauration, lorsque la base de données source est codée en UTF8?

dba.stackexchange https://dba.stackexchange.com/questions/4777

  •  16-10-2019
  •  | 
  •  

Question

On m'a donné la tâche de migrer une base de données PostgreSQL 8.2.x vers un autre serveur. Pour ce faire, j'utilise le pgAdmin 1.12.2 (sur Ubuntu 11.04 par la voie) et en utilisant la sauvegarde et de restauration en utilisant le format personnalisé / compress (.backup) et UTF8.

La base de données d'origine est en UTF8, comme suit:

-- Database: favela

-- DROP DATABASE favela;

CREATE DATABASE favela
  WITH OWNER = favela
       ENCODING = 'UTF8'
       TABLESPACE = favela
       CONNECTION LIMIT = -1;

Je crée cette base de données exactement comme celui-ci sur le serveur de destination. Mais quand je ramènerai la base de données à partir du fichier .backup en utilisant l'option de restauration, il me donne certaines de ces erreurs:

pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a709
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT:  COPY arena, line 62

Quand je vérifie quel enregistrement déclenché cette erreur, en fait, certains champs de VarText ont des caractères diacritiques comme C (utilisé en portugais, par exemple, « caça »), et quand je les supprimer manuellement du texte dans les dossiers l'erreur passe à l'enregistrement suivant qui les a - depuis quand la copie est une erreur, il arrête l'insertion de données sur ce tableau. Et je ne veux pas les remplacer manuellement un par un pour accomplir cette tâche.

Mais il est un peu étrange car avec UTF8 il ne devrait pas être ce genre de problèmes, non?

Je ne sais pas comment ils sont arrivés là en premier lieu. Je ne la migration de la base de données, et je supose que en quelque sorte la base de données était comme dans LATIN1 et a été mal changé en UTF8.

Est-il possible de vérifier si une table / base de données a des séquences UTF8 invalides? Ou un moyen d'appliquer / reconvertir ces caractères dans UFT8 donc je ne rencontrez un problème quand j'exécute la restauration?

Merci à l'avance.

Était-ce utile?

La solution

En fouillant Internet, j'ai vu que cela est un problème assez commun. La solution commune est d'utiliser la décharge de format texte brut et le nourrir iconv pour corriger l'encodage.

est plus d'informations à ce sujet.

Autres conseils

  

« Je ne sais pas comment ils sont arrivés là en premier lieu »

Il aurait pu se produire comme décrit - bien que cela génère une erreur sur 8.4:

  

Si vous créez une table avec tout type de texte (ce texte, varchar (10),   etc.), vous pouvez insérer une séquence d'octets non valide dans ce domaine   à l'aide échappe octal.

     

Par exemple, si vous avez une base de données UTF8, vous pouvez faire:

     

=> CREATE TABLE foo (t TEXT);

     

=> INSERT INTO foo (E '\ 377');

     

Maintenant, si vous copiez le tableau, vous ne pouvez pas copier le dos du fichier résultant   en. Cela signifie que vos sauvegardes de pg_dump ne seront pas en mesure de restaurer. Le seul   pour obtenir votre retour de données est à nouveau échapper à cette valeur.

Il y a un bon post sur ce un blog sur les questions générales et des façons de les traiter

Il est probable avec l'encodage par défaut utilisé dans votre environnement Unix / Linux. Pour vérifier que le codage est actuellement celui par défaut, exécutez la commande suivante:

$ echo $LANG
en_US

Dans ce cas, nous pouvons voir clairement ce n'est pas un codage UTF-8, celui qui la commande de copie repose sur.

Donc, pour résoudre ce problème, nous venons de mettre la variable LANG dans l'exemple à ce qui suit:

$ export LANG=en_US.UTF-8

Note: Ce ne sera disponible que pour la session en cours. Ajoutez à ~ / .bashrc ou similaire à l'avoir disponible au démarrage d'une session shell future.

Référence

Je ne recommande pas aveuglément courir iconv sur la décharge de texte brut, car il peut convertir des caractères valides (par exemple: les caractères chinois) à d'autres personnages. Il est préférable de trouver le caractère UTF8 invalide en exécutant la commande ci-dessous.

grep -naxv '.*' plain_text_dump.sql

et puis exécutez iconv sur les données particulières. Consultez ce document pour l'étape détaillée par étape explication .

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top