Le caractère avec encodage UTF8 N'a pas d'équivalent dans WIN1252

je suis 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, soit via SQL, soit par programmation?

(La solution SQL doit être préférée).

je pensais me connecter au DB en utilisant WIN1252, mais ça va donner le même problème.

27
demandé sur Stefan Steiger 2009-10-14 13:37:38

8 réponses

Que faites-vous quand vous recevez ce message? Importez-vous un fichier à Postgres? Comme l'a dit devstuff, c'est un personnage de BOM. Il s'agit d'un caractère que Windows écrit en premier à un fichier texte, lorsqu'il est sauvegardé dans L'encodage UTF8 - il est invisible, 0-Largeur de caractère, de sorte que vous ne le verrez pas en l'ouvrant dans un éditeur de texte.

essayez d'ouvrir ce fichier dans Notepad, save-as it in ANSI encoding et ajoutez (ou remplacez similaire) set client_encoding to 'WIN1252' ligne dans votre fichier.

6
répondu Tometzky 2009-10-14 14:00:53

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

plus d'informations sont disponibles sur le wiki PostgreSQL sous Charge Du Jeu De Caractères (devel docs).

23
répondu Andy Terra 2013-10-15 21:05:23

ne pas effacer les caractères, ils sont réels et utilisés pour de bonnes raisons. Au lieu de cela, eridicate Win1252.

5
répondu MSalters 2009-10-14 09:53:09

cela ressemble à la séquence octet 0xBD, 0xBF, 0xEF comme un entier little-endian. Il s'agit de la forme codée UTF8 du caractère octet-ordre-marque (BOM) Unicode 0xFEFF.

Je ne sais pas quel est le comportement normal de Postgre, mais le BOM est normalement utilisé uniquement pour encoder la détection au début d'un flux d'entrée, et n'est généralement pas retourné dans le cadre du résultat.

dans tous les cas, votre exception est due à ce point de code n'ayant pas de mappage dans le code Win1252 page. Cela se produira aussi avec la plupart des autres caractères non latins, comme ceux utilisés dans les scripts asiatiques.

pouvez-vous changer L'encodage de la base de données en UTF8 au lieu de 1252? Cela permettra à vos colonnes de contenir presque n'importe quel caractère.

1
répondu devstuff 2009-10-14 10:05:27

j'ai été en mesure de se déplacer par l'utilisation de la Postgres' fonction de sous-chaîne et de la sélectionner à la place:

select substring(comments from 1 for 200) from billing

le commentaire que le caractère spécial a commencé chaque champ a été d'une grande aide pour le résoudre finalement.

1
répondu Christian A Strasser 2014-10-27 18:07:22

j'ai eu un problème similaire. J'avais un serveur lié depuis SQL Server vers une base de données PostgreSQL. Certaines données que j'avais dans le tableau que je sélectionnais en utilisant une instruction openquery avaient un caractère qui n'avait pas d'équivalent dans Win1252. Le problème était que l'entrée DSN système (qui se trouve sous L'administrateur source de données ODBC) que j'avais utilisé pour la connexion était configurée pour utiliser PostgreSQL ANSI(x64) plutôt que PostgreSQL Unicode(x64). Création d'une nouvelle source de données avec L'Unicode la prise en charge et la création d'un nouveau serveur lié modifié et le référencement du nouveau serveur lié dans votre openquery ont résolu le problème pour moi. Les jours heureux.

0
répondu Maurice M 2016-10-25 05:50:10

ce problème nous est apparu vers le 19/11/2016 avec notre ancienne application Access 97 accédant à un postgresql 9.1 DB.

ceci a été résolu en changeant le pilote en UNICODE au lieu de ANSI (voir le commentaire de plang).

0
répondu Maxime Langlois 2016-11-22 17:35:16

Voici ce qui a fonctionné pour moi : 1 activer les requêtes ad-hoc dans sp_configure. 2 Ajouter ODBC DSN pour votre serveur PostgreSQL lié. 3 Assurez-vous d'avoir les pilotes ANSI et Unicode (x64) (essayez avec les deux). 4 exécutez la requête comme ceci ci-dessous-changez L'UID, l'ip du serveur, le nom de la base de données et le mot de passe. 5 Il suffit de garder la requête dans la 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
répondu s6a6n6d6m6a6n 2017-11-02 20:16:45