PostgreSQL: Configuración del Idioma (locales)

Este es el Post #4 del Topic: Guía Práctica de PostgreSQL

SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver a crearla.
Descargar Script: DBAdmision.sql

Antes de acelerar con postgresql es necesario conocer algunos datos importantes como la configuración de  locales.

El término “locale”, se refiere a la localización o también conocida como internacionalización, el cual hace posible poder internacionalizar las aplicaciones tanto en el tipo de idioma, escritura, etc.

Fichero de Configuración

En un anterior capítulo sobre Especificación de Ficheros. se realizó la descripción de los ficheros de configuración.

Variables de Locales

# These settings are initialized by initdb, but they can be changed.
lc_messages = ‘Spanish_Spain.1252’ # para mensages de error
lc_monetary = ‘Spanish_Spain.1252’ # para monedas
lc_numeric = ‘Spanish_Spain.1252’ # para numeros
lc_time = ‘Spanish_Spain.1252’ # para fecha y hora

En www.opengroup.org puede conseguir más información sobre las variables de internacionalización.

Fichero de Configuración

Ahora realizaremos algunas pruebas modificando las locales:

1. Mostrar locales

Los resultados de la configuración son relativos ya que dependerá de la configuración desde el momento de la instalación de PostgreSQL.

Otro aspecto importante es saber con qué versión del servidor de postgresql estamos trabajando ya que con Postgresql 8.3 existe un problemilla de seteo  de las locales pero que con Postgresql 8.4 esto funciona correctamente.

He realizado las pruebas tanto en plataforma windows como linux, y tanto con Postgresql 8.3 como con Postgresql 8.4.

Ustedes deberian testear su configuraciòn según la explicación posterior, en el caso mio las configuraciones son estas:

En Linux/Debian:

SHOW lc_messages; --> Retorna: "es_PE.UTF-8"
SHOW lc_monetary; --> Retorna: "es_PE.UTF-8"
SHOW lc_numeric; --> Retorna: "es_PE.UTF-8"
SHOW lc_time; --> Retorna: "es_PE.UTF-8"

En Windows

SHOW lc_messages; --> Retorna: "Spanish_Spain.1252"
SHOW lc_monetary; --> Retorna: "Spanish_Spain.1252"
SHOW lc_numeric; --> Retorna: "Spanish_Spain.1252"
SHOW lc_time; --> Retorna: "Spanish_Spain.1252"

Quiero aclarar que las locales que toma Postgresql en linux es el del sistema operativo,  Para ver el idioma por defecto bastará con abrir el terminal de linux y ejecutar:

echo $LANG

y también ejecutar en el query de postgres:

SHOW lc_time; SHOW lc_numeric; SHOW lc_monetary; --etc etc etc

Notarán que la salida para ambos casos son iguales en linux., si es que se agregan nuevas locales al sistema operativo habrá que reiniciar el servicio de postgresql para poder utilizar las nuevas locales en éste.

Las locales que trae por defecto linux son POSIX y C y el  del idioma elegido al momento de istalar el sistema operativo, aunque es posible agregar nuevas locales en la post-instalación, particularmente utilizo en debian el: dpkg-reconfigure locales para agregar otras locales.

Si está en linux puede ver las locales disponibles y los alias existentes para las locales respectivamente en los ficheros: /etc/locale.gen y /etc/locale.alias

Algunos ejemplos de alias de locales existentes en linux que podremos usar al momento de setear las locales para Postgresql son:

spanish         es_ES.ISO-8859-1
german        de_DE.ISO-8859-1
danish          da_DK.ISO-8859-1

Cuando instalamos posgresql en windows es también posible manejar directamente alias como por ejemplo: spanish, english, etc…. También se puede usar la local  ‘C’ para setear  el idioma a inglés.

2. Setear (Establecer) locales

Ahora realizaré un ejemplo con lc_time para realizar el seteo  de la configuración horaria, para ello primero quiero que observen lo siguiente, pero antes aclaro que para este ejemplo haré uso de Postgresql 8.4 ya que la  v8.3 no responde correctamente a esta solicitud :

SELECT to_char('Apr 14 1987 12:00AM'::date, 'TMDay, DD TMMonth YYYY');

Retorna: “Martes, 14 Abril 1987”

Según la configuración del lc_time de mi ordenador retornará con valores en español, a pesar de que envío parámetros en otra configuración regional, por ejemplo Apr está en inglés, En español sería Abr.

De otra manera,

Si seteo la configuación de lc_time a Inglés:

SET lc_time='english';

ó

SET lc_time='C';

Ahora vuelvo a realizar la consulta:

SELECT to_char('Apr 14 1987 12:00AM'::date, 'TMDay, DD TMMonth YYYY');

Retorna: “Tuesday, 14 April 1987”

Por último:

Vuelvo a setear lc_time pero ahora a español.

El seteo se realizará con cualquiera de las locales obtenidas  iniciialmente en el  topic “1. Mostrar Locales:”:

SET lc_time='spanish';

ó

SET lc_time='Spanish_Spain.1252';

ó

SET lc_time='es_PE.UTF-8';

Ahora vuelvo a realizar la consulta:

SELECT to_char('Apr 14 1987 12:00AM'::date, 'TMDay, DD TMMonth YYYY');

Retorna: “Martes, 14 Abril 1987”

Postgresql 8.3 acepta como válidas todas estas peticiones de seteo, pero no logra cambiar al idioma que establecemos, únicamente permanece en el formato inglés. Buscando alguna referencia sobre la razón de esto encontré entre la documentación de postgresql 8.3 :

lc_time (string)

Sets the locale to use for formatting date and time values. (Currently, this setting does nothing, but it might in the future.) Acceptable values are system-dependent; see Section 22.1 for more information. If this variable is set to the empty string (which is the default) then the value is inherited from the execution environment of the server in a system-dependent way.

Traducción:

Establece la configuración regional para utilizar el formato de fecha y hora. (Actualmente, esta opción no hace nada, pero podría en el futuro.) Los valores aceptables son dependiente del sistema, vea Sección 22.1 para más información. Si esta variable se establece en la cadena vacía (que es el predeterminado), el valor es heredado del entorno de ejecución del servidor en un sistema de forma dependiente.

3. Resetear (Reconfigurar) locales

Hasta el momento, todos los seteos realizados fueron únicamente de manera temporal, si queremos hacer algo permanente, habrá que editar el archivo indicado inicialmente.

Si queremos reestablecer las locales a la configuración inicial solo bastará con resetear las locales necesarias:

RESET lc_messages;
RESET lc_monetary;
RESET lc_numeric;
RESET lc_time;

CASO PRÁCTICO:

Especificación de Ficheros

Todo lo descrito hasta aquì no es envano, tiene un fin práctico, para ello se necesita que tenga preparado el entorno dbadmision, si tiene  instalado postgresql 8.3 y 8.4 podrá seguir la explicación completa.

Lo que se hará es escenificar posibles errores con la mala configuración de las locales, en este post nos preocupamos más por la variable lc_time, ya que servirá para realizarar el ejemplo.

1) Registraremos a un contacto llamado anonymous, de aquì nos interesa el formato de las 2 fechas, especìficamente en los meses que son Nov(November) y Dec(December), ambos en formato inglés.

Probando en Postgresql 8.3 y 8.4

La insersión se debe ralizar sin ningún problema. Postgresql 8.3 y 8.4 aceptan la insersión de la fecha  con formato  “Dec 18 2005  5:05PM” por ahora únicamente en idioma  inglés, espero que esto no continue limintádonos en futuras versiones.

INSERT INTO Persona.contacto(
    Nombres
    ,Paterno
    ,Materno
    ,Genero
    ,DNI
    ,FechaNac
    ,FechaCreacion)
VALUES (
    'Anonymous'
    ,'Anonymous'
    ,'Anonymous'
    ,'0'
    ,'12345678'
    ,'Nov 14 1987 12:00AM'
    ,'Dec 18 2005  5:05PM');

Después de que la inserción haya sido satisfactoria eliminemos el registro para volver a registrar los mismos datos. Realizamos la eliminación ya que postgresql no permitirá registrar los mismos datos  2 veces porque algunos campos  fueron creados bajo criterio de no-duplicidad (ver PostgreSQL: Sentencias DDL (1) ).

DELETE FROM Persona.contacto WHERE Nombres='Anonymous';

Para la siguiente insersión nótese que el formato de los meses ahora están en español Nov(Noviembre) , Dic(Diciembre), y sabemos de antemano que el formato reconocible  para inserción de fechas por Postgresql 8.3 y 8.4 es el inglés, aunque las locales digan lo contrario. Intentemos registrarlo:

INSERT INTO Persona.contacto(
    Nombres
    ,Paterno
    ,Materno
    ,Genero
    ,DNI
    ,FechaNac
    ,FechaCreacion)
VALUES (
    'Anonymous'
    ,'Anonymous'
    ,'Anonymous'
    ,'0'
    ,'12345678'
    ,'Nov 14 1987 12:00AM'
    ,'Dic 18 2005  5:05PM');

Postgresql emitirá un mensaje de error como el siguiente:

ERROR: invalid input syntax for type timestamp: “Dic 18 2005 5:05PM”

Éste error se dá porque el valor Dic no existe para la configuración en inglés (En Inglés es Dec), en cambio no  emite un mensaje de error para Nov, porque éste si es válido para los 2 idiomas, de todos modos, la inserción con el formato español no logrará concretarse..

3 thoughts on “PostgreSQL: Configuración del Idioma (locales)

  1. El porblema que yo tengo es en los money si quiere insertar un dato del tipo ‘$336,900.001′, marca error, modificando set lc_monetary =’English_United States.1252’; ya no da error pero solo inserta ” ” en vez del numero 336,900.001 alguna idea como solucionanrlo?

Deja un comentario