win1252 utf8_decode utf8 postgres es_es codificacion change cambiar postgresql encoding utf-8 character

utf8_decode - select utf8 postgresql



El carácter con codificación UTF8 no tiene equivalente en WIN1252 (8)

Estoy recibiendo la siguiente excepción:

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

¿Hay una manera de erradicar tales caracteres, ya sea a través de SQL o mediante programación?
(Se debe preferir la solución SQL).

Estaba pensando en conectarme a la base de datos utilizando WIN1252, pero dará el mismo problema.


¿Qué haces cuando recibes este mensaje? ¿Importas un archivo a Postgres? Como dice Devstuff, es un personaje de la lista de materiales. Este es un carácter que Windows escribe primero en un archivo de texto, cuando se guarda en codificación UTF8: es un carácter invisible, de ancho 0, por lo que no lo verá cuando lo abra en un editor de texto.

Intente abrir este archivo, por ejemplo, en el Bloc de notas, guárdelo como en la codificación ANSI y agregue (o reemplace) set client_encoding to ''WIN1252'' línea set client_encoding to ''WIN1252'' en su archivo.


Este problema apareció para nosotros el 19/11/2016 con nuestra antigua aplicación Access 97 accediendo a una base de datos postgresql 9.1.

Esto se resolvió cambiando el controlador a UNICODE en lugar de ANSI (vea el comentario de plang).


Esto es lo que funcionó para mí: 1 habilitar consultas ad-hoc en sp_configure. 2 agregue ODBC DSN para su servidor PostgreSQL vinculado. 3 asegúrese de tener los controladores ANSI y Unicode (x64) (intente con ambos). 4 ejecute la consulta como esta a continuación: cambie UID, ip de servidor, nombre de db y contraseña. 5 simplemente mantenga la consulta en la última línea en formato 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;'')


No erijas a los personajes, son reales y se usan por buenas razones. En su lugar, eridicate Win1252.


Pude evitarlo usando la función de subcadena de Postgres y seleccionando eso en su lugar:

select substring(comments from 1 for 200) from billing

El comentario de que el carácter especial comenzó en cada campo fue de gran ayuda para resolverlo finalmente.


Se parece a la secuencia de bytes 0xBD, 0xBF, 0xEF como un entero little-endian. Esta es la forma codificada en UTF8 del carácter 0xFEFF de byte-order-mark (BOM) de Unicode.

No estoy seguro de cuál es el comportamiento normal de Postgre, pero la lista de materiales normalmente se usa solo para codificar la detección al comienzo de un flujo de entrada, y generalmente no se devuelve como parte del resultado.

En cualquier caso, su excepción se debe a que este punto de código no tiene una asignación en la página de códigos de Win1252. Esto también ocurrirá con la mayoría de los otros caracteres no latinos, como los que se usan en los scripts asiáticos.

¿Se puede cambiar la codificación de la base de datos para que sea UTF8 en lugar de 1252? Esto permitirá que sus columnas contengan casi cualquier carácter.


Tuve un problema muy similar. Tenía un servidor vinculado desde SQL Server a una base de datos PostgreSQL. Algunos de los datos que tenía en la tabla que estaba seleccionando al usar una declaración openquery tenían algún carácter que no tenía un equivalente en Win1252. El problema fue que la entrada de DSN del sistema (que se encuentra en el Administrador de fuente de datos ODBC) que había usado para la conexión estaba configurada para usar PostgreSQL ANSI (x64) en lugar de PostgreSQL Unicode (x64). Crear un nuevo origen de datos con el soporte de Unicode y crear un nuevo servidor vinculado modificado y hacer referencia al nuevo servidor vinculado en su openquery resolvió el problema por mí. Días felices.


Tuve un problema similar y lo resolví configurando la codificación a UTF8 con /encoding UTF8 en el cliente antes de intentar INSERT INTO foo (SELECT * from bar WHERE x=y); . Mi cliente estaba usando la codificación WIN1252 pero la base de datos estaba en UTF8, de ahí el error.

Hay más información disponible en el wiki de PostgreSQL en Soporte de conjuntos de caracteres (documentos de desarrollo).