web-dev-qa-db-fra.com

Le caractère avec la séquence d'octets 0x9d dans le codage «WIN1252» n'a pas d'équivalent dans le codage «UTF8»

Je lis un fichier csv dans mon script sql et je copie ses données dans une table sql postgre. La ligne de code est ci-dessous:

\copy participants_2013 from 'C:/Users/Acrotrend/Desktop/mip_sahil/mip/reelportdata/Participating_Individual_Extract_Report_MIPJunior_2013_160414135957.Csv' with CSV delimiter ',' quote '"' HEADER;

J'obtiens l'erreur suivante: le caractère avec la séquence d'octets 0x9d dans le codage 'WIN1252' n'a pas d'équivalent dans le codage 'UTF8'.

Quelqu'un peut-il m'aider sur la cause de ce problème et comment le résoudre?

16
Sahil Doshi

Le problème est que 0x9D n'est pas une valeur d'octet valide dans WIN1252. Il y a un tableau ici: https://en.wikipedia.org/wiki/Windows-1252

Le problème peut être que vous importez un fichier UTF-8 et que postgresql utilise par défaut Windows-1252 (qui, je crois, est la valeur par défaut sur de nombreux systèmes Windows).

Vous devez changer le jeu de caractères sur votre ligne de commande Windows avant d'exécuter le script avec chcp . Ou en postgresql vous pouvez:

SET CLIENT_ENCODING TO 'utf8';

Avant d'importer le fichier.

35
Philip Couling

Tout encodage a des plages numériques de code valide. Êtes-vous sûr que vos données sont au codage win1252?

Postgres est très strict et n'importe aucun fichier cassé d'encodage possible. Vous pouvez utiliser iconv qui peut fonctionner en mode tolérant, et il peut supprimer les caractères brisés. Après le nettoyage par iconv, vous pouvez importer le fichier.

1
Pavel Stehule

Spécifiez simplement encoding 'UTF-8' comme codage dans le \copy commande, par exemple (Je l'ai divisé en deux lignes pour plus de lisibilité mais gardez tout sur la même ligne):

\copy dest_table from 'C:/src-data.csv' 
                 (format csv, header true, delimiter ',', encoding 'UTF8');

Plus de détails:

Le problème est que le codage client est défini sur WIN1252, probablement parce qu'il s'exécute sur une machine Windows mais que le fichier a un UTF-8 caractère dedans.

Vous pouvez vérifier le codage client avec

SHOW client_encoding;

 client_encoding
-----------------
WIN1252
0
isapir