web-dev-qa-db-fra.com

Le caractère avec le codage UTF8 n'a pas d'équivalent dans WIN1252

Je reçois l'exception suivante:

Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "WIN1252"

Existe-t-il un moyen d’éradiquer de tels caractères, via SQL ou par programme? 
(La solution SQL devrait être préférée).

Je pensais me connecter à la base de données en utilisant WIN1252, mais cela poserait le même problème.

28
Monis Iqbal

Que faites-vous quand vous recevez ce message? Importez-vous un fichier dans Postgres? Comme l'a dit devstuff, il s'agit d'un caractère de nomenclature. Il s’agit d’un caractère que Windows écrit en premier dans un fichier texte, lorsqu’il est enregistré au format UTF8 - il est invisible, le caractère 0-largeur, vous ne le verrez donc pas lorsqu’il sera ouvert dans un éditeur de texte.

Essayez d'ouvrir ce fichier par exemple dans le Bloc-notes, enregistrez-le sous un codage ANSI et ajoutez (ou remplacez une ligne similaire) set client_encoding to 'WIN1252' dans votre fichier.

6
Tometzky

J'ai eu un problème similaire, et j'ai résolu en définissant le codage sur UTF8 avec \encoding UTF8 dans le client avant de tenter un INSERT INTO foo (SELECT * from bar WHERE x=y);. Mon client utilisait le codage WIN1252 mais la base de données était en UTF8, d’où l’erreur.

Plus d'informations sont disponibles sur le wiki de PostgreSQL sous Support du jeu de caractères (devel docs).

24
Andy Terra

N'éradiquez pas les personnages, ils sont réels et utilisés pour de bonnes raisons. Au lieu de cela, éradiquez Win1252.

5
MSalters

Cela ressemble à la séquence d'octets 0xBD, 0xBF, 0xEF sous la forme d'un entier little-endian. Il s'agit de la forme codée UTF8 du caractère 0xFEFF Unicode byte-order-mark (BOM).

Je ne suis pas sûr du comportement normal de Postgre, mais la nomenclature est normalement utilisée uniquement pour la détection du codage au début d'un flux d'entrée et n'est généralement pas renvoyée dans le résultat.

Dans tous les cas, votre exception est due au fait que ce point de code n'a pas de mappage dans la page de code Win1252. Cela se produira également avec la plupart des caractères non latins, tels que ceux utilisés dans les scripts asiatiques.

Pouvez-vous changer le codage de la base de données en UTF8 au lieu de 1252? Cela permettra à vos colonnes de contenir presque tous les caractères.

1
devstuff

J'ai pu contourner le problème en utilisant la fonction sous-chaîne de Postgres et en sélectionnant celle-ci:

select substring(comments from 1 for 200) from billing

Le commentaire selon lequel le caractère spécial a démarré chaque champ a été d'une grande aide pour le résoudre enfin.

1

J'ai eu un problème très similaire. J'ai eu un serveur lié de SQL Server à une base de données PostgreSQL. Certaines données de la table que je sélectionnais à l'aide d'une instruction openquery contenaient un caractère qui n'avait pas d'équivalent dans Win1252. Le problème était que l'entrée DSN système (à trouver sous l'administrateur de source de données ODBC) que j'avais utilisée pour la connexion était configurée pour utiliser PostgreSQL ANSI (x64) plutôt que PostgreSQL Unicode (x64). La création d'une nouvelle source de données avec le support Unicode, la création d'un nouveau serveur lié modifié et la réinscription du nouveau serveur lié dans votre openquery ont résolu le problème pour moi. Jours heureux.

0
Maurice M

Ce problème est apparu vers nous le 19/11/2016 avec notre ancienne application Access 97 accédant à une base de données postgresql 9.1.

Ce problème a été résolu en modifiant le pilote sous UNICODE au lieu de ANSI (voir commentaire de procédure).

0
Maxime Langlois

Voici ce qui a fonctionné pour moi: 1 activez les requêtes ad-hoc dans sp_configure . 2 add ODBC DSN pour votre serveur PostgreSQL lié . 3 assurez-vous que vous disposez des codes ANSI et Unicode ( x64) drivers (essayez avec les deux) . 4 lancez la requête comme celle ci-dessous - changez l’ID utilisateur, l’IP du serveur, le nom de la base de données et le mot de passe . 5 conservez simplement la requête en dernière ligne au format postgreSQL.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

SELECT * FROM OPENROWSET('MSDASQL', 
'Driver=PostgreSQL Unicode(x64); 
uid=loginid;
Server=1.2.3.41;
port=5432;
database=dbname;
pwd=password',

'select * FROM table_name limit 10;')
0
s6a6n6d6m6a6n