•»Huevos de yoshi (Ocio) ►Tutoriales

Cambiar la codificación de caracteres en Postgres

Apenas me sucedió que al estar trabajando un sistema con JSP y PostgreSQL (v8.3) al tratar de generar y guardar un registro que tuviera un carácter latino (para ser preciso un acento [´] ), provocaba el siguiente error:

carácter 0xc293 de codificación «UTF8» no tiene equivalente en «WIN1252»

Esto era debido a la codificación de mi base de datos (se encontraba en WIN1252) por lo que tenia que cambiarla a UTF8 o bien LATIN1, busque información en google donde encontré el siguiente link que fue de gran ayuda. Basándome en la explicación del link anterior explico como cambiar la codificación desde pgAdmin II (aunque debe ser igual desde línea de comandos) , los pasos son los siguientes:

1.- Conocer los tipos de datos soportados por PostgreSQL los encontramos en: http://www.postgresql.org/docs/8.0/interactive/multibyte.html

2.- Basándonos en la tabla ejecutar el siguiente comando en la consola SQL

   1: update pg_database set encoding=8 where datname='mibd';


 image

Donde encoding se refiere al tipo de codificación en este caso el “8” corresponde a LATIN1 y datname es el nombre de nuestra base de datos a la cual le queremos cambiar la codificación (en este caso nuestra base de datos se llama mibd).

Para identificar el tipo de encoding correspondiente a su numero entero he creado la siguiente tabla:

N° de encoding

Name

Descripción

0

SQL_ASCII

ASCII

1

EUC_JP

Japanese EUC

2

EUC_CN

Chinese EUC

3

EUC_KR

Korean EUC

4

JOHAB

Korean EUC (Hangle base)

5

EUC_TW

Taiwan EUC

6

UNICODE

Unicode (UTF-8)

7

MULE_INTERNAL

Mule internal code

8

LATIN1

ISO 8859-1/ECMA 94 (Latin alphabet no.1)

9

LATIN2

ISO 8859-2/ECMA 94 (Latin alphabet no.2)

10

LATIN3

ISO 8859-3/ECMA 94 (Latin alphabet no.3)

11

LATIN4

ISO 8859-4/ECMA 94 (Latin alphabet no.4)

12

LATIN5

ISO 8859-9/ECMA 128 (Latin alphabet no.5)

13

LATIN6

ISO 8859-10/ECMA 144 (Latin alphabet no.6)

14

LATIN7

ISO 8859-13 (Latin alphabet no.7)

15

LATIN8

ISO 8859-14 (Latin alphabet no.8)

16

LATIN9

ISO 8859-15 (Latin alphabet no.9)

17

LATIN10

ISO 8859-16/ASRO SR 14111 (Latin alphabet no.10)

18

ISO_8859_5

ISO 8859-5/ECMA 113 (Latin/Cyrillic)

19

ISO_8859_6

ISO 8859-6/ECMA 114 (Latin/Arabic)

20

ISO_8859_7

ISO 8859-7/ECMA 118 (Latin/Greek)

21

ISO_8859_8

ISO 8859-8/ECMA 121 (Latin/Hebrew)

22

KOI8

KOI8-R(U)

23

ALT

Windows CP866

24

WIN874

Windows CP874 (Thai)

25

WIN1250

Windows CP1250

26

WIN

Windows CP1251

27

WIN1256

Windows CP1256 (Arabic)

28

TCVN

TCVN-5712/Windows CP1258 (Vietnamese)

Con esta tabla sabremos que numero corresponde a que codificación siendo así, por ejemplo si quisiera cambiar la codificación de mi tabla a UTF-8 tendría el siguiente código:

   1: update pg_database set encoding=6 where datname='mibd';

 

Como pueden ver es muy sencillo espero sea de utilidad, como lo fue para mi ;).

-.-. Los comentaros son motivos para continuar con el blog .-.-

Update de utilidad: Configuración actual del sistema para no tener problemas con acentos(´) ni eñes (ñ):

PostgreSQL: LATIN1

image

Dreamweaver: charset=iso-8859-1

image

18 comentarios

    1. Hola,,, ioe un favor.. me podrias decir de donde sacaste esa tabla,,, quiero sabes si realizaste un quierie para verla o como la sacaste,, por q necesito hacer un boton tipo select sin necesidad de escibir todos esos,, me harias un gran paro,,

    2. Que tal ya cambié todo de PostgreSQL y el dreamweaver si lo tengo configurado así, el problema que tengo al jalar un dato via php y éste dato trae una Ñ me aparcce algo asi como Ñ en lugar de la Ñ no sabes como poder corregir esto?

      Saludos

  1. hey muchas gracias me funcionó perfect…jejeje solo un comentario para Dummies… este código se corre desde un sql de la base de datos…
    saludos y muchas gracias

  2. Hola
    Es muy buena la ayuda que brindas…
    Tengo una consulta..
    Yo trabajo con un ERP Adempiere en Postgres 8.3.7, necesito cambiar la codificación actualmente tengo UTF8 porque al hacer un copy desde un archivo de datos no pude por las tildes, ñ y demás caracteres especiales.
    Que complicaciones funcionales tendría al cambiar la codificación de la mi DB?.

    Gracias.. Espero tu respuesta.

    Saludos

    1. Con mi experiencia, no hubo problema alguno al cambiar de UTF8 a Latin1 , aunque con una consulta SQL de la siguiente forma:

      query donde se emplea la codificacion LATIN1

      SELECT CODIGO_CP, COLONIA_CP, ESTADO_CP, CIUDAD_CP, MNPIO_CP
      FROM CAT_CPOSTALES
      WHERE TO_ASCII(COLONIA_CP, ‘LATIN1’) LIKE ‘%BENITO JUAREZ%’ ORDER BY ESTADO_CP

      Esta consulta ignara los caracteres especiales (acentos, ñ, etc..) en los resultados , por lo que si ponemos BENITO JUAREZ en los resultados no podria traer DON BENITO JÚAREZ , observar la U tiene acento , con una consulta normal (sin el to_ascii LATIN1) este resultado no seria mostrado.

      😛

  3. Carnalito…. gracias por esta información. Sin duda alguna Postgres me acepto «ñ», acentos y demas.

    Me cae que pegue un brinco cuando vi como me aceptaba estos caracteres.

    Gracias….

  4. tenía el mismo problema con (á,é…ú) Ññ, las solución fue
    consultar qeu codificación tenía mi base

    select * from pg_database

    realizar un update para cambira la codifiación estaba en 6

    update pg_database set encoding=8 where datname=’mibasedatos’;

    ver si el cambio se realizó
    select * from pg_database

    insertar registro para verificar el cambio
    ahora funciona

  5. En su momento esto fue de gran utilidad pero actualmente si instalas las versiones de postgres 8.4 en adelante con UNICODE UTF-8 acepta todos los caracteres
    un ejemplo seria asi:
    para Exportar
    copy novedad to ‘/planos/novedad’ BINARY
    donde novedad es el nombre de mi tabla
    planos/novedad la ruta donde quedará el archivo plano con el nombre igual al de mi tabla.
    Binary es la forma en que deseo grabar mi archivo plano donde puede ser CSV o el que vos elijas.

    Para Importar solo cambias el To por el from y listo
    copy novedad from ‘/planos/novedad’ BINARY

  6. Hola he realizado las siguientes adaptaciones a mi codigo:
    use Encode;
    use utf8;
    use CGI qw(:standard);
    use CGI::Carp qw(fatalsToBrowser);
    use DBI;

    binmode STDOUT, «:utf8″;

    print
    header( -charset =>»utf8»),
    start_html(‘CGI MINIMO’);

    Empleo:
    $causa= decode_utf8($ref_eventos->{‘causa’}); ##Descripcion de caracteres especiales

    Y no visualizo caracteres especiales, alguna otra idea?

    Apesar que posgres utiliza el UTF8 por default, me asegure configurando el SET CLIENT_ENCODING TO ‘UTF8’

    Y no obtengo el resultado correcto, alguien me puede apoyar descifrando que esta sucediendo con mi servidor, gracias.

  7. Hola, en vez de cambiar la codificación de toda una base de datos, ¿se podría cambiar únicamente unas de las tablas de dicha BD?
    Gracias

  8. Fe de erratas: Hola, en vez de cambiar la codificación de toda una base de datos, ¿se podría cambiar únicamente la codificación de una de las tablas de dicha BD?
    Gracias

Deja un comentario