Re: initdb -E LATIN9 no funciona

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gunnar Wolf <gwolf(at)gwolf(dot)org>
Cc: Javier Aquino H(dot) <jaquino(at)lexuseditores(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: initdb -E LATIN9 no funciona
Date: 2010-09-24 14:46:03
Message-ID: 1285338659-sup-2982@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from Gunnar Wolf's message of vie sep 24 09:07:51 -0400 2010:

> > Y funcionó, pero tengo una duda, habrá algún degrado de performance al tener LC_COLLATE y LC_CTYPE en 'C' ????
>
> No. Las operaciones de costumbre son sólo de almacenamiento,
> comparación, envío... Claro, la cadena va a ser muy ligeramente más
> larga. Pero en nuestro idioma, la diferencia es bajísima.

Hay un par de operaciones que están optimizadas para codificaciones que
tienen máximo largo de carácter de uno (es decir, no multibyte). Pueden
ser un pelín más lentas en UTF8. Pero concuerdo con Gunnar en que es
mucho mejor usar UTF8.

> > Valdrá la pena usar UTF8 (que almacena entre 1 y 4 bytes por
> > carácter) o LATIN9 (1 byte por carácter) pero con LC_COLLATE y
> > LC_CTYPE en 'C' ????? que es mejor ????
>
> Ummm... Bueno, no entiendo bien a qué te refieres. En general, C
> significa "por default, si no especificaste nada" - Lo cual tiende a
> significar en_US.ASCII. Pero en este último punto puedo estar
> equivocado.

Lo que sucede es que Postgres distingue las dos cosas con mucha
claridad, que en el resto de los sistemas tienden a mezclarse y
confundirse como si fueran una sola: la codificación y el locale
(que en nuestra traducción llamamos “configuración regional”). Una
configuración regional de en_US.utf-8 indica que el locale propiamente
tal es en_US (es decir usando las reglas del inglés de EEUU para
ordenamiento de cadenas, formato de fechas y dinero, etc) y que usa
codificación UTF-8. A diferencia del locale en_US, que en estricto
rigor significa en_US.ISO8859-1, que usa las mismas reglas del inglés de
EEUU pero con codificación Latin1 (más formalmente conocido como
ISO-8859-1).

En Postgres, por motivos de implementación, sólo se te permite usar una
codificación dentro del cluster de bases de datos que sea compatible con
el locale definido. Es decir, si tu cluster lo definiste como es_PE
(que, como ya dije, se refiere a es_PE.ISO8859-1), entonces todas las
bases de datos deben ser Latin1. Existe una excepción, mencionada en la
documentación de CREATE DATABASE:

The character set encoding specified for the new database must
be compatible with the chosen locale settings (LC_COLLATE and
LC_CTYPE). If the locale is C (or equivalently POSIX), then all
encodings are allowed, but for other locale settings there is
only one encoding that will work properly.

Es decir se te permite crear una BD UTF8 en un cluster Latin1, siempre y
cuando definas el locale a C. Es posible que esto tenga efectos
secundarios no deseados: por ejemplo puede ser (no tengo claridad que
sea así) que el ordenamiento de cadenas de caracteres no sea el español.

--
Álvaro Herrera <alvherre(at)commandprompt(dot)com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ivette 2010-09-24 14:51:42
Previous Message Gunnar Wolf 2010-09-24 13:07:51 Re: initdb -E LATIN9 no funciona