El soporte de configuración regional (locale) se refiere a que una aplicación respete las preferencias culturales en cuanto a alfabetos, ordenación, formato de números, etc. PostgreSQL utiliza las facilidades estándar de configuración regional de ISO C y POSIX proporcionadas por el sistema operativo del servidor. Para obtener información adicional, consulta la documentación de tu sistema.
El soporte de configuración regional se inicializa automáticamente cuando se crea un clúster de
bases de datos utilizando initdb. Por defecto, initdb
inicializará el clúster de bases de datos con la configuración regional de su entorno de ejecución,
por lo que si tu sistema ya está configurado para utilizar la configuración regional que deseas
en tu clúster de bases de datos, no necesitas hacer nada más. Si deseas utilizar una configuración
regional diferente (o no estás seguro de qué configuración regional tiene asignada tu sistema),
puedes indicarle exactamente a initdb qué configuración regional debe utilizar
especificando la opción --locale. Por ejemplo:
initdb --locale=sv_SE
Este ejemplo para sistemas Unix establece la configuración regional en sueco (sv)
tal como se habla en Suecia (SE). Otras posibilidades podrían incluir
en_US (inglés de EE. UU.) y fr_CA (francés canadiense).
Si se puede utilizar más de un juego de caracteres para una configuración regional, las
especificaciones pueden tomar la forma language_territory.codeset.
Por ejemplo, fr_BE.UTF-8 representa el idioma francés (fr) tal como se habla en
Bélgica (BE), con una codificación de juego de caracteres UTF-8.
Qué configuraciones regionales están disponibles en tu sistema y con qué nombres depende de lo
proporcionado por el fabricante del sistema operativo y de lo que se haya instalado. En la mayoría
de los sistemas Unix, el comando locale -a proporcionará una lista de las
configuraciones regionales disponibles. Windows utiliza nombres de configuración regional más detallados,
como German_Germany o Swedish_Sweden.1252, pero los principios
son los mismos.
Ocasionalmente es útil mezclar reglas de varias configuraciones regionales, por ejemplo, utilizar reglas de ordenación en inglés pero mensajes en español. Para admitir esto, existe un conjunto de subcategorías de configuración regional que controlan solo ciertos aspectos de las reglas de localización:
LC_COLLATE | Orden de clasificación de cadenas |
LC_CTYPE | Clasificación de caracteres (¿Qué es una letra? ¿Cuál es su equivalente en mayúscula?) |
LC_MESSAGES | Idioma de los mensajes |
LC_MONETARY | Formato de las cantidades monetarias |
LC_NUMERIC | Formato de los números |
LC_TIME | Formato de fechas y horas |
Los nombres de las categorías se traducen en nombres de opciones de initdb para
anular la elección de configuración regional para una categoría específica. Por ejemplo, para establecer
la configuración regional en francés canadiense, pero utilizar las reglas de EE. UU. para dar formato a
la moneda, utiliza initdb --locale=fr_CA --lc-monetary=en_US.
Si deseas que el sistema se comporte como si no tuviera soporte de configuración regional, utiliza el
nombre de configuración regional especial C, o de manera equivalente
POSIX.
Algunas categorías de configuración regional deben tener sus valores fijados al crear la base de datos.
Puedes utilizar configuraciones diferentes para bases de datos diferentes, pero una vez creada una base de datos,
ya no puedes cambiarlas para esa base de datos. LC_COLLATE y LC_CTYPE
son estas categorías. Afectan al orden de ordenación de los índices, por lo que deben mantenerse fijas, de lo
contrario los índices en las columnas de texto se corromperían. (Pero puedes mitigar esta restricción utilizando
ordenaciones (collations), como se describe en Section 23.2). Los valores por defecto para estas
categorías se determinan cuando se ejecuta initdb, y esos valores se utilizan cuando se crean
nuevas bases de datos, a menos que se especifique lo contrario en el comando CREATE DATABASE.
Las otras categorías de configuración regional se pueden cambiar cuando se desee estableciendo los parámetros de
configuración del servidor que tienen el mismo nombre que las categorías de configuración regional (consulta
Section 19.11.2 para más detalles). Los valores elegidos por
initdb en realidad solo se escriben en el archivo de configuración
postgresql.conf para que sirvan como valores por defecto cuando se inicia el servidor.
Si eliminas estas asignaciones de postgresql.conf, el servidor heredará las configuraciones
de su entorno de ejecución.
Ten en cuenta que el comportamiento de la configuración regional del servidor está determinado por las variables de entorno que ve el servidor, no por el entorno de ningún cliente. Por lo tanto, ten cuidado de configurar los ajustes de configuración regional correctos antes de iniciar el servidor. Una consecuencia de esto es que si el cliente y el servidor están configurados con configuraciones regionales diferentes, los mensajes podrían aparecer en diferentes idiomas dependiendo de dónde se originaron.
Cuando hablamos de heredar la configuración regional del entorno de ejecución, esto significa lo siguiente en la
mayoría de los sistemas operativos: Para una categoría de configuración regional dada, por ejemplo el ordenamiento,
se consultan las siguientes variables de entorno en este orden hasta que se encuentre una que esté definida:
LC_ALL, LC_COLLATE (o la variable correspondiente a la categoría respectiva),
LANG. Si ninguna de estas variables de entorno está definida, la configuración regional se establece
por defecto en C.
Algunas bibliotecas de localización de mensajes también buscan la variable de entorno LANGUAGE, la
cual anula todas las demás configuraciones regionales con el fin de establecer el idioma de los mensajes. En caso
de duda, consulta la documentación de tu sistema operativo, en particular la relacionada con
gettext.
Para permitir que los mensajes se traduzcan al idioma de preferencia del usuario, se debe haber seleccionado
NLS en el momento de la compilación (configure --enable-nls). Todo el demás
soporte de configuración regional se compila automáticamente.
La configuración regional influye en las siguientes características de SQL:
El orden de clasificación en las consultas que utilizan ORDER BY o los operadores de
comparación estándar en datos textuales.
Los operadores de coincidencia de patrones (LIKE, SIMILAR TO y expresiones
regulares de estilo POSIX); las configuraciones regionales afectan tanto a la coincidencia insensible a mayúsculas
y minúsculas como a la clasificación de caracteres por expresiones regulares de clases de caracteres.
La capacidad de utilizar índices con cláusulas LIKE.
El inconveniente de utilizar configuraciones regionales distintas de C o POSIX
en PostgreSQL es su impacto en el rendimiento. Ralentiza el manejo de caracteres y evita que
los índices ordinarios sean utilizados por LIKE. Por esta razón, utiliza configuraciones regionales
solo si realmente las necesitas.
Como solución alternativa para permitir que PostgreSQL utilice índices con cláusulas
LIKE bajo una configuración regional que no sea C, existen varias clases de operadores personalizadas.
Estas permiten la creación de un índice que realiza una comparación estricta carácter por carácter, ignorando las reglas
de comparación de la configuración regional. Consulta Section 11.10 para obtener más información.
Otro enfoque es crear índices utilizando la ordenación C, como se describe en
Section 23.2.
Las configuraciones regionales se pueden seleccionar en diferentes ámbitos según los requerimientos. La descripción general
anterior mostró cómo se especifican las configuraciones regionales utilizando initdb para establecer los
valores por defecto para todo el clúster. La siguiente lista muestra dónde se pueden seleccionar las configuraciones
regionales. Cada elemento proporciona los valores por defecto para los elementos posteriores, y cada elemento inferior
permite anular los valores por defecto con una granularidad más fina.
Como se explicó anteriormente, el entorno del sistema operativo proporciona los valores por defecto para las configuraciones regionales de un clúster de bases de datos recién inicializado. En muchos casos, esto es suficiente: si el sistema operativo está configurado para el idioma/territorio deseado, por defecto PostgreSQL también se comportará de acuerdo con esa configuración regional.
Como se mostró anteriormente, las opciones de línea de comandos para initdb especifican los ajustes de
configuración regional para un clúster de bases de datos recién inicializado. Utiliza esto si el sistema operativo no tiene la
configuración regional que deseas para tu sistema de bases de datos.
Se puede seleccionar una configuración regional por separado para cada base de datos. El comando SQL
CREATE DATABASE y su equivalente en línea de comandos createdb tienen opciones para ello.
Utiliza esto, por ejemplo, si un clúster de bases de datos alberga bases de datos para múltiples clientes con diferentes
requerimientos.
Los ajustes de configuración regional se pueden realizar para columnas de tablas individuales. Esto utiliza un objeto SQL llamado ordenación (collation) y se explica en Section 23.2. Utiliza esto, por ejemplo, para ordenar datos en diferentes idiomas o personalizar el orden de clasificación de una tabla en particular.
Finalmente, las configuraciones regionales se pueden seleccionar para una consulta individual. Nuevamente, esto utiliza objetos de ordenación SQL. Esto podría utilizarse para cambiar el orden de clasificación en función de elecciones en tiempo de ejecución o para experimentación ad-hoc.
Un proveedor de configuración regional especifica qué biblioteca define el comportamiento de la configuración regional para las ordenaciones y clasificaciones de caracteres.
Los comandos y herramientas que seleccionan los ajustes de configuración regional, como se describió anteriormente, tienen cada uno una opción para seleccionar el proveedor de configuración regional. Aquí hay un ejemplo para inicializar un clúster de bases de datos utilizando el proveedor ICU:
initdb --locale-provider=icu --icu-locale=en
Consulta la descripción de los comandos y programas respectivos para obtener más detalles. Ten en cuenta que puedes mezclar proveedores
de configuración regional con diferentes granularidades, por ejemplo, utilizar libc por defecto para el clúster
pero tener una base de datos que utilice el proveedor icu, y luego tener objetos de ordenación que utilicen cualquiera
de los proveedores dentro de esas bases de datos.
Independientemente del proveedor de configuración regional, el sistema operativo todavía se utiliza para proporcionar algunos comportamientos sensibles a la configuración regional, como los mensajes (consulta lc_messages).
Los proveedores de configuración regional disponibles se enumeran a continuación:
builtin
El proveedor builtin utiliza operaciones integradas. Solo se admiten las configuraciones regionales
C, C.UTF-8 y PG_UNICODE_FAST para este proveedor.
El comportamiento de la configuración regional C es idéntico a la configuración regional C en
el proveedor libc. Al utilizar esta configuración regional, el comportamiento puede depender de la codificación de la base de datos.
La configuración regional C.UTF-8 está disponible solo cuando la codificación de la base de datos es
UTF-8, y el comportamiento se basa en Unicode. El ordenamiento utiliza únicamente los valores de los puntos de código.
Las clases de caracteres de expresiones regulares se basan en la semántica «compatible con POSIX», y el mapeo de mayúsculas/minúsculas es la
variante «simple».
La configuración regional PG_UNICODE_FAST está disponible solo cuando la codificación de la base de datos es
UTF-8, y el comportamiento se basa en Unicode. El ordenamiento utiliza únicamente los valores de los puntos de código.
Las clases de caracteres de expresiones regulares se basan en la semántica «Estándar», y el mapeo de mayúsculas/minúsculas es la
variante «completa».
icu
El proveedor icu utiliza la biblioteca externa ICU.
PostgreSQL debe haber sido configurado con dicho soporte.
ICU proporciona un comportamiento de ordenación y clasificación de caracteres que es independiente del sistema operativo y de la
codificación de la base de datos, lo cual es preferible si esperas realizar la transición a otras plataformas sin ningún cambio en
los resultados. LC_COLLATE y LC_CTYPE se pueden establecer independientemente de la configuración
regional de ICU.
Para el proveedor ICU, los resultados pueden depender de la versión de la biblioteca ICU utilizada, ya que esta se actualiza para reflejar los cambios en el lenguaje natural a lo largo del tiempo.
libc
El proveedor libc utiliza la biblioteca C del sistema operativo. El comportamiento de ordenación y clasificación de
caracteres está controlado por los ajustes LC_COLLATE y LC_CTYPE, por lo que no se pueden establecer
de forma independiente.
El mismo nombre de configuración regional puede tener un comportamiento diferente en diferentes plataformas cuando se utiliza el proveedor libc.
El formato de ICU para el nombre de la configuración regional es una etiqueta de idioma (Language Tag).
CREATE COLLATION mycollation1 (provider = icu, locale = 'ja-JP'); CREATE COLLATION mycollation2 (provider = icu, locale = 'fr');
Al definir un nuevo objeto de ordenación ICU o una base de datos con ICU como proveedor, el nombre de configuración regional dado se transforma («canonicaliza») en una etiqueta de idioma si no está ya en esa forma. Por ejemplo:
CREATE COLLATION mycollation3 (provider = icu, locale = 'en-US-u-kn-true'); NOTICE: using standard form "en-US-u-kn" for locale "en-US-u-kn-true" CREATE COLLATION mycollation4 (provider = icu, locale = 'de_DE.utf8'); NOTICE: using standard form "de-DE" for locale "de_DE.utf8"
Si ves este aviso, asegúrate de que el provider y el locale tengan el resultado esperado. Para obtener
resultados consistentes al utilizar el proveedor ICU, especifica la etiqueta de idioma canónica
en lugar de confiar en la transformación.
Una configuración regional sin nombre de idioma, o con el nombre de idioma especial root, se transforma para tener el
idioma und («undefined»).
ICU puede transformar la mayoría de los nombres de configuración regional de libc, así como algunos otros formatos, en etiquetas de idioma para facilitar la transición a ICU. Si se utiliza un nombre de configuración regional de libc en ICU, es posible que no tenga exactamente el mismo comportamiento que en libc.
Si hay un problema al interpretar el nombre de la configuración regional, o si este representa un idioma o región que ICU no reconoce, verás la siguiente advertencia:
CREATE COLLATION nonsense (provider = icu, locale = 'nonsense'); WARNING: ICU locale "nonsense" has unknown language "nonsense" HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. CREATE COLLATION
icu_validation_level controla cómo se reporta el mensaje. A menos que se establezca en ERROR,
el ordenamiento se creará de todos modos, pero el comportamiento podría no ser el que el usuario pretendía.
Una etiqueta de idioma, definida en BCP 47, es un identificador estandarizado que se utiliza para identificar idiomas, regiones y otra información sobre una configuración regional.
Las etiquetas de idioma básicas son simplemente language-region;
o incluso solo language. El language es un código de idioma (por ejemplo,
fr para el francés), y el region es un código de región (por ejemplo, CA
para Canadá). Ejemplos: ja-JP, de o fr-CA.
Los ajustes de ordenación se pueden incluir en la etiqueta de idioma para personalizar el comportamiento del ordenamiento. ICU permite una amplia personalización, como la sensibilidad (o insensibilidad) a los acentos, a las mayúsculas y minúsculas y a los signos de puntuación; el tratamiento de los dígitos dentro del texto; y muchas otras opciones para satisfacer una variedad de usos.
Para incluir esta información adicional de ordenación en una etiqueta de idioma, añade -u, que indica que hay ajustes
de ordenación adicionales, seguido de uno o más pares -key-value.
La key es la clave para un ajuste de ordenación y
value es un valor válido para ese ajuste. Para los ajustes booleanos, se puede especificar la
-key sin un -value correspondiente, lo que
implica un valor de true.
Por ejemplo, la etiqueta de idioma en-US-u-kn-ks-level2 significa la configuración regional con el idioma inglés en la
región de EE. UU., con los ajustes de ordenación kn establecidos en true y ks
establecidos en level2. Esos ajustes significan que el ordenamiento será insensible a las mayúsculas y minúsculas y tratará
una secuencia de dígitos como un solo número:
CREATE COLLATION mycollation5 (provider = icu, deterministic = false, locale = 'en-US-u-kn-ks-level2'); SELECT 'aB' = 'Ab' COLLATE mycollation5 as result; result -------- t (1 row) SELECT 'N-45' < 'N-123' COLLATE mycollation5 as result; result -------- t (1 row)
Consulta Section 23.2.3 para obtener detalles y ejemplos adicionales sobre el uso de etiquetas de idioma con información de ordenación personalizada para la configuración regional.
Si el soporte de configuración regional no funciona de acuerdo con la explicación anterior, verifica que el soporte de configuración regional
en tu sistema operativo esté configurado correctamente. Para verificar qué configuraciones regionales están instaladas en tu sistema, puedes
utilizar el comando locale -a si tu sistema operativo lo proporciona.
Verifica que PostgreSQL esté utilizando realmente la configuración regional que crees que está utilizando. Las
configuraciones LC_COLLATE y LC_CTYPE se determinan al crear una base de datos, y no se pueden cambiar excepto
creando una nueva base de datos. Otras configuraciones regionales, incluidas LC_MESSAGES y LC_MONETARY, se
determinan inicialmente por el entorno en el que se inicia el servidor, pero se pueden cambiar sobre la marcha. Puedes verificar las
configuraciones regionales activas utilizando el comando SHOW.
El directorio src/test/locale en la distribución de fuentes contiene un conjunto de pruebas para el soporte de
configuración regional de PostgreSQL.
Las aplicaciones cliente que manejan errores del lado del servidor analizando el texto del mensaje de error obviamente tendrán problemas cuando los mensajes del servidor estén en un idioma diferente. Se aconseja a los autores de tales aplicaciones que utilicen en su lugar el esquema de códigos de error.
Mantener catálogos de traducciones de mensajes requiere el esfuerzo continuo de muchos voluntarios que desean ver que PostgreSQL hable bien su idioma de preferencia. Si los mensajes en tu idioma no están disponibles actualmente o no están completamente traducidos, se agradecería tu ayuda. Si deseas ayudar, consulta Chapter 56 o escribe a la lista de correo de los desarrolladores.