lunes, 25 de junio de 2007

Pasos a seguir para modificar el charset interno (UTF8 a ISO-88591) del cluster de postgresql en ubuntu.

Primero se preguntaran ¿para que cambiarlo?, ¿que gano?, bueno, pues lo mismo pensaba yo, hasta un infortunado dia que necesite usar la funcion upper incorporada dentro de postgresql en un trigger y me di cuenta que la letra acentuada aparecia en minuscula y las demas letras aparecian bien en mayusculas y lo mismo pasaba con las ñ y las dieresis ö, pues bien, lo primero que se me ocurrio es ver si se trataba de un bug o solo era problema mio de configuración. Pues bien mande un correo a la lista de postgresql y el buen Alvaro Herrera me confirmo que en su sistema trabajaba bien la funcion upper y lower, asi que descarte el problema del bug, hice pruebas y me di cuenta que con Unicode si trabajaba bien dicha funcion pero no con ISO-8859-1 entonces otro buen compañero de la lista de nombre Alejandro Gasca me comento que los locale podrian estar mal configurados.

Como muchos sabran ubuntu emplea casi para todo UTF8 y ahi estaba el problema, pues despues de mucho googlear y de investigar me tope con el comando locale -a que muestra los charset instalados en el sistema y me di cuenta que por ningun lado aparecia ISO-8859-1.

Pues segui googleando y me tope que era muy facil agregar dicho charset, solo bastaba con editar el archivo /var/lib/locales/supported.d/es y agregar el siguiente texto en una nueva linea:

es_MX.ISO-8859-1 ISO-8859-1

Guardamos cambios y generamos la nueva lista de charsets con:

locale-gen

y listo, ya tenia la codificación ISO-8859-1 en mi sistema con ubuntu, ahora seguia lo bueno, reconstruir el cluster de postgresql, que como todos sabemos viene preempacado en ubuntu y se instala solito, tal como esta. Pues aqui tienen los pasos y espero que les funciona como a mi.

1.- Respaldamos todas las bases si existen ;)

2.- Paramos el ORDBMS Postgresql con:
/etc/init.d/postgresql-8.2 stop

3.- Nos ubicamos en el directorio de datos del cluster:
cd /var/lib/postgresql/8.2

Un leve vistazo mediante ls -alF en el directorio pgdata nos damos cuenta que es un vinculo simbolico :( y que apunta a la ruta antes citada.

4.- El directorio "main" contiene el cluster de la base de datos con codificación UTF-8, el directorio main lo renombramos para tener un punto de restauración si algo falla.

mv main main.old

5.- Creamos un nuevo directorio main para que el script de inicio de ubuntu ni lo note ;)

mkdir main

y cambiamos al propietario de dicho directorio con:

chown -R postgres.postgres main

6.- Ejecutamos initdb que en ubuntu feisty-fawn esta en: /usr/lib/postgresql/8.2/bin/ y ya con el nuevo charset ISO-8859-1

su postgres -c '/usr/lib/postgresql/8.2/bin/initdb -U postgres --locale=es_MX.ISO88591 --encoding=Latin1 --lc-collate=Latin1 -D /var/lib/postgresql/8.2/main'

7.- Ya por ultimo creamos las ligas simbolicas server.crt, server.key y root.crt necesarias para nuestro guion /etc/init.d/postgresql-8.2 de nuestro ubuntu.

ln -s /etc/postgresql-common/root.crt root.crt
ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key server.key

8.- Y listo, iniciamos nuevamente el servicio de postgresql y somos muy felices porque ya tenemos nuestro postgresql configurado con el charset ISO-8859-1.

/etc/init.d/postgresql-8.2 start

Saludos a todos :)

3 comentarios:

Las 'CH' dijo...

Muchas Gracias Cesar por esta info.
Muy agradecido


Pancho
operrone@gmail.com

Anónimo dijo...

oye, con un par de modificaciones me ha valido para modificar el problema de 8.3 y latin1. muchas gracias

Anónimo dijo...

Saludos, No he tenido suerte, he seguido todos los pasos pero al iniciar postgres tengo el siguiente error:
Starting PostgreSQL 8.3 database server: mainThe PostgreSQL server failed to start. Please check the log output: FATAL: invalid value for parameter "lc_messages": "es_VE.UTF-8" failed!
Me gustaria saber esas modificaciones para trabajar con la version 8.3 y latin1... Muchas gracias...

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo