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?
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".
psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';
ajout de encoding
option a fonctionné dans mon cas.
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.
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.
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.
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 !
vous pouvez remplacer le caractère backslash par, par exemple, un caractère pipe, avec sed.
sed -i -- 's/\/|/g' filename.txt
suivre les étapes ci-dessous pour résoudre ce problème dans pgadmin:
-
SET client_encoding = 'ISO_8859_5';
-
COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;
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.
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
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.
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';
vous pouvez essayer ceci pour gérer L'encodage UTF8.
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.
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.
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é)
ouvrir le fichier CSV by Notepad++ . Choisir menu Encoding
\ Encoding in UTF-8
, puis fixer quelques cellules manuellement.
puis réessayez import.