séquence d'octets invalide pour encodage "UTF8""

je suis essayez 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 alors j'obtiens l'erreur,

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

comment je répare ça? Dois-je modifier l'encodage de l'ensemble de ma base de données (si oui, comment?) ou Puis-je simplement changer l'encodage de ma table tmp ? Ou dois-je essayer de changer l'encodage du fichier?

96
demandé sur Community 2011-02-01 22:51:12

16 réponses

si vous avez besoin de 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. Juste un clic droit de la base de données et sélectionnez "Propriétés".

mais cette erreur semble vous dire qu'il y a des données UTF8 invalides dans votre fichier source. Cela signifie que l'utilitaire copy a détecté ou deviné que vous lui avez fourni un fichier UTF8.

si vous utilisez une variante De Unix, vous pouvez vérifier l'encodage (plus ou moins) avec l'utilitaire file .

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(je pense que cela fonctionnera sur Macs dans le terminal, aussi.) Vous ne savez pas comment faire sous Windows.

si vous utilisez ce même utilitaire sur un fichier qui vient des systèmes de Windows (c'est-à-dire un fichier qui est et non 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 pourriez essayer de convertir vos données d'entrée en un encodage connu, pour changer l'encodage de votre client, ou les deux. (Nous étirons vraiment les limites de mes connaissances sur les encodages.)

vous pouvez utiliser l'utilitaire iconv pour changer l'encodage des données d'entrée.

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

vous pouvez changer l'encodage psql (le client) en suivant les instructions sur le Support des jeux de caractères . Sur cette page, la recherche de l'expression "Pour permettre le jeu de caractères de conversion".

89
répondu Mike Sherrill 'Cat Recall' 2017-09-11 20:03:57
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

ajout de encoding option a fonctionné dans mon cas.

40
répondu Nobu 2014-05-21 21:23:08

apparemment je peux juste mettre l'encodage à la volée,

 set client_encoding to 'latin1'

et puis relancer la requête. Je ne sais pas quel encodage je devrais utiliser.


latin1 rendu les caractères lisibles, mais la plupart des caractères accentués étaient en majuscules où ils n'auraient pas dû être. J'ai supposé que c'était dû à un mauvais encodage, mais je pense que c'est en fait les données qui étaient juste mauvaises. J'ai fini conserver l'encodage latin1, mais pré-traiter les données et régler les problèmes de boîtier.

9
répondu mpen 2015-09-23 20:44:54

cette erreur signifie que les enregistrements encodant dans le fichier sont différents par rapport à la connexion. Dans ce cas, iconv peut renvoyer l'erreur, parfois même malgré / / ignorer le drapeau:

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

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

le truc est de trouver des caractères incorrects et de les remplacer. Pour le faire sous Linux, utilisez l'éditeur "vim" :

vim (fichier texte), appuyez sur la touche "ESC": bouton et le type ":goto (nombre retourné par iconv)"

pour trouver des caractères non ASCII, vous pouvez utiliser la commande suivante:

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

si vous supprimez les caractères incorrects s'il vous plaît vérifier si vous avez vraiment besoin de convertir votre fichier: probablement le problème est déjà résolu.

6
répondu Yuri Levinsky 2013-06-11 09:07:13

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

si vous l'obtenez à partir d'une version anglaise ou européenne occidentale de Windows, votre meilleur pari est probablement le réglage de 'WIN1252'. Si vous l'obtenez d'une autre source, consultez la liste des encodages de caractères ici:

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

si vous le recevez de un Mac, vous pouvez avoir à l'exécuter à travers l'utilitaire" iconv " d'abord pour le convertir de MacRoman à UTF-8.

4
répondu BobG 2011-02-01 20:08:34

Eh bien, je faisais face au même problème. Et ce qui a résolu mon problème est ceci:

dans excel cliquez sur Enregistrer sous. À partir de save as type, choisissez .csv Cliquez sur Tools . Ensuite, choisissez options web dans la liste déroulante. Sous encodage onglet, Enregistrer le document comme Unicode(UTF-8) . Cliquez sur OK. Enregistrez le fichier. FAIT !

4
répondu Vishal Chhatwani 2016-05-26 20:43:48

vous pouvez remplacer le caractère backslash par, par exemple, un caractère pipe, avec sed.

sed -i -- 's/\/|/g' filename.txt
2
répondu Richard Greenwood 2015-06-14 22:23:11

suivre les étapes ci-dessous pour résoudre ce problème dans pgadmin:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;

2
répondu Ramesh R 2016-08-29 17:33:40

j'ai eu le même problème et trouvé une solution sympa ici: http://blog.e-shell.org/134

ceci est causé par une inadéquation dans l'encodage de votre base de données, sûrement parce que la base de données d'où vous avez obtenu le dump SQL a été encodée en SQL_ASCII alors que la nouvelle est encodée en UTF8. .. Recode est un petit outil du projet GNU qui vous permet de changer à la volée l'encodage d'un fichier donné.

So Je viens de recoder le fichier dump avant de le rejouer:

postgres> gunzip -c /var/backups/pgall_b1.zip | recode iso-8859-1..u8 | psql test

dans les systèmes Debian ou Ubuntu, recode peut être installé par paquet.

2
répondu Ed Doerr 2017-03-13 04:34:32

si vous êtes d'accord avec la suppression des caractères non convertibles, Vous pouvez utiliser -c flag

iconv -c -t utf8 filename.csv > filename.utf8.csv

et ensuite copiez-les à votre table

2
répondu Abdellah Alaoui 2017-11-03 12:03:47

pour python, vous devez utiliser

Classe pg8000.type.Bytea (str) Bytea est une classe dérivée de str qui est mappée à un tableau de bytes PostgreSQL.

ou

Pg8000.Binaire (valeur) Construire un objet contenant des données binaires.

1
répondu vrn 2017-05-18 11:09:46
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

vous pouvez essayer ceci pour gérer L'encodage UTF8.

1
répondu Rishi jha 2017-09-04 07:00:38

cette erreur peut se produire si les données d'entrée contiennent le caractère escape lui-même. Par défaut, le caractère d'échappement est le symbole"\", donc si votre texte d'entrée contient le caractère " \ " - essayer de changer la valeur par défaut en utilisant L'option D'échappement.

0
répondu jaasco 2014-05-27 11:08:11

il est également très possible avec cette erreur que le champ soit crypté en place. Assurez-vous que vous regardez la bonne table, dans certains cas les administrateurs vont créer une vue non cryptée que vous pouvez utiliser à la place. J'ai récemment rencontré un très semblable question.

0
répondu Josh Barton 2016-02-08 20:38:40

j'ai eu la même erreur quand j'ai essayé de copier un csv généré par Excel dans une table Postgres (tous sur un Mac). C'est ainsi que je l'ai résolu:

1) Ouvrir le fichier dans Atom (L'IDE que j'utilise)

2) apporter un changement insignifiant au dossier. Enregistrez le fichier. Annuler la modification. Enregistrer de nouveau.

Presto! Commande de copie travaillé maintenant.

(je pense Qu'Atom l'a enregistré dans un format qui a fonctionné)

0
répondu Anupam 2017-03-27 07:10:34

ouvrir le fichier CSV by Notepad++ . Choisir menu Encoding \ Encoding in UTF-8 , puis fixer quelques cellules manuellement.

puis réessayez import.

0
répondu Do Nhu Vy 2018-04-19 03:19:16