158 votes

séquence d'octets non valide pour l'encodage "UTF8".

Je suis J'essaie d'importer des données dans ma base de données. J'ai donc créé une table temporaire,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

Et maintenant j'essaie d'importer les données ,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

Mais ensuite j'obtiens l'erreur,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

Comment puis-je réparer ça ? Dois-je modifier l'encodage de l'ensemble de ma base de données (si oui, comment ?) ou puis-je modifier uniquement l'encodage de mon fichier tmp table ? Ou dois-je tenter de modifier l'encodage du fichier ?

0 votes

Changer l'option d'encodage à l'importation. J'ai mis le mien sur "Windows-1251" et ça a marché sans problème.

1 votes

Merci @BrianD, j'étais également confronté à ce problème et cela a fonctionné pour moi.

131voto

Si vous devez stocker des données UTF8 dans votre base de données, vous avez besoin d'une base de données qui accepte UTF8. Vous pouvez vérifier l'encodage de votre base de données dans pgAdmin. Il suffit de faire un clic droit sur la base de données et de sélectionner "Propriétés".

Mais cette erreur semble vous indiquer qu'il y a des données UTF8 invalides dans votre fichier source. Cela signifie que le copy a détecté ou deviné que vous lui fournissez un fichier UTF8.

Si vous êtes sous une variante d'Unix, vous pouvez vérifier l'encodage (plus ou moins) avec la commande file utilitaire.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Je pense que cela fonctionnera aussi sur les Macs dans le terminal.) Je ne sais pas comment faire sous Windows.

Si vous utilisez ce même utilitaire sur un fichier provenant des systèmes Windows (c'est-à-dire un fichier qui est pas encodé en UTF8), il affichera probablement quelque chose comme ceci :

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

Si les choses restent bizarres, vous pouvez essayer de convertir vos données d'entrée dans un encodage connu, de changer l'encodage de votre client, ou les deux. (Nous étendons vraiment les limites de mes connaissances sur les encodages).

Vous pouvez utiliser le iconv pour modifier l'encodage des données d'entrée.

iconv -f original_charset -t utf-8 originalfile > newfile

Vous pouvez changer l'encodage de psql (le client) en suivant les instructions de la page Support des jeux de caractères . Sur cette page, recherchez la phrase "Pour activer la conversion automatique des jeux de caractères".

4 votes

Il dit que le fichier est ASCII, mais il contient des caractères accentués, donc cela doit être faux ?

0 votes

@Mark : Eh bien, soit la copie PostgreSQL se trompe, soit l'utilitaire de fichier se trompe. Pour un fichier Windows qui a des accents, file me dit "texte ISO-8859, avec des terminaisons de ligne CRLF". La documentation de copy dire "Les données d'entrée sont interprétées selon l'encodage actuel du client, même si les données ne passent pas par le client mais sont lues ou écrites dans un fichier directement par le serveur". Hmmm. Je pense que je sais comment changer cela.

0 votes

Je ne sais pas si votre meilleure chance est d'essayer de convertir les données dans un encodage connu, de changer l'encodage du client pendant l'importation, ou les deux. Je vais modifier ma réponse.

71voto

Nobu Points 1800
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Ajout de encoding a fonctionné dans mon cas.

2 votes

Il s'exécutera sans erreur, il peut ou non donner des résultats utiles. vous devez connaître l'encodage prévu des données.

1 votes

Dans mon scénario, comment la requête ci-dessus a-t-elle fonctionné ? J'ai un fichier csv encodé en UTF8 et une base de données encodée en UTF8.

8voto

Yuri Levinsky Points 411

Cette erreur signifie que l'encodage des enregistrements dans le fichier est différent par rapport à la connexion. Dans ce cas, iconv peut retourner l'erreur, parfois même malgré le drapeau //IGNORE :

iconv -f ASCII -t utf-8//IGNORE < b.txt > /a.txt

iconv : séquence d'entrée illégale à la position (un certain nombre)

L'astuce consiste à trouver les caractères incorrects et à les remplacer. Pour le faire sous Linux, utilisez l'éditeur "vim" :

vim (votre fichier texte), appuyez sur le bouton "ESC" : et tapez ":goto (numéro renvoyé par iconv)".

Pour trouver les caractères non ASCII, vous pouvez utiliser la commande suivante :

grep --color='auto' -P "[ \x80 - \xFF ]"

Si vous supprimez des caractères incorrects, vérifiez si vous avez vraiment besoin de convertir votre fichier : le problème est probablement déjà résolu.

0 votes

iconv -c -f utf8 -t utf8//IGNORE < dirty.txt > clean.txt

5voto

BobG Points 953

Cela dépend du type de machine/encodage qui a généré votre fichier d'importation.

Si vous l'obtenez à partir d'une version anglaise ou ouest-européenne de Windows, votre meilleure chance est probablement de le régler sur 'WIN1252'. Si vous l'obtenez d'une autre source, consultez la liste des codages de caractères ici :

http://www.postgresql.org/docs/8.3/static/multibyte.html

Si vous l'obtenez à partir d'un Mac, vous devrez peut-être le faire passer par l'utilitaire "iconv" pour le convertir de MacRoman en UTF-8.

2voto

jaasco Points 1

Cette erreur peut se produire si les données d'entrée contiennent elles-mêmes un caractère d'échappement. Par défaut, le caractère d'échappement est le symbole "\", donc si votre texte d'entrée contient le caractère "\" - essayez de changer la valeur par défaut en utilisant l'option ESCAPE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X