23.2. Soporte de ordenamiento (Collation) #

23.2.1. Conceptos
23.2.2. Gestión de ordenaciones
23.2.3. Ordenaciones personalizadas de ICU

La característica de ordenamiento (collation) permite especificar el orden de clasificación y el comportamiento de clasificación de caracteres de los datos por columna, o incluso por operación. Esto alivia la restricción de que los ajustes LC_COLLATE y LC_CTYPE de una base de datos no se pueden cambiar después de su creación.

23.2.1. Conceptos #

Conceptualmente, cada expresión de un tipo de datos ordenable tiene un ordenamiento. (Los tipos de datos ordenables integrados son text, varchar y char. Los tipos base definidos por el usuario también se pueden marcar como ordenables, y por supuesto un dominio sobre un tipo de datos ordenable es ordenable). Si la expresión es una referencia a una columna, el ordenamiento de la expresión es el ordenamiento definido de la columna. Si la expresión es una constante, el ordenamiento es el ordenamiento por defecto del tipo de datos de la constante. El ordenamiento de una expresión más compleja se deriva de los ordenamientos de sus entradas, como se describe a continuación.

El ordenamiento de una expresión puede ser el ordenamiento «por defecto» (default), lo que significa los ajustes de configuración regional definidos para la base de datos. También es posible que el ordenamiento de una expresión sea indeterminado. En tales casos, las operaciones de ordenamiento y otras operaciones que necesiten conocer el ordenamiento fallarán.

Cuando el sistema de base de datos tiene que realizar una ordenación o una clasificación de caracteres, utiliza el ordenamiento de la expresión de entrada. Esto sucede, por ejemplo, con las cláusulas ORDER BY y las llamadas a funciones u operadores como <. El ordenamiento a aplicar para una cláusula ORDER BY es simplemente el ordenamiento de la clave de clasificación. El ordenamiento a aplicar para una llamada a una función u operador se deriva de los argumentos, como se describe a continuación. Además de los operadores de comparación, las ordenaciones son tenidas en cuenta por las funciones que convierten entre letras mayúsculas y minúsculas, como lower, upper e initcap; por los operadores de coincidencia de patrones; y por to_char y funciones relacionadas.

Para una llamada a una función u operador, el ordenamiento que se deriva al examinar las ordenaciones de los argumentos se utiliza en tiempo de ejecución para realizar la operación especificada. Si el resultado de la llamada a la función u operador es de un tipo de datos ordenable, el ordenamiento también se utiliza en tiempo de análisis como el ordenamiento definido de la expresión de la función u operador, en caso de que haya una expresión circundante que requiera el conocimiento de su ordenamiento.

La derivación de ordenamiento (collation derivation) de una expresión puede ser implícita o explícita. Esta distinción afecta a cómo se combinan las ordenaciones cuando aparecen múltiples ordenaciones diferentes en una expresión. Una derivación de ordenamiento explícita ocurre cuando se utiliza una cláusula COLLATE; todas las demás derivaciones de ordenamiento son implícitas. Cuando es necesario combinar múltiples ordenaciones, por ejemplo en una llamada a una función, se utilizan las siguientes reglas:

  1. Si alguna expresión de entrada tiene una derivación de ordenamiento explícita, entonces todas las ordenaciones derivadas explícitamente entre las expresiones de entrada deben ser iguales, de lo contrario se produce un error. Si hay alguna ordenación derivada explícitamente, ese es el resultado de la combinación de ordenaciones.

  2. De lo contrario, todas las expresiones de entrada deben tener la misma derivación de ordenamiento implícita o el ordenamiento por defecto. Si hay alguna ordenación diferente a la por defecto, ese es el resultado de la combinación de ordenaciones. De lo contrario, el resultado es el ordenamiento por defecto.

  3. Si hay ordenaciones implícitas distintas a la por defecto en conflicto entre las expresiones de entrada, entonces se considera que la combinación tiene una ordenación indeterminada. Esta no es una condición de error a menos que la función en particular que se está invocando requiera el conocimiento de la ordenación que debe aplicar. Si lo requiere, se producirá un error en tiempo de ejecución.

Por ejemplo, considera esta definición de tabla:

CREATE TABLE test1 (
    a text COLLATE "de_DE",
    b text COLLATE "es_ES",
    ...
);

Luego en:

SELECT a < 'foo' FROM test1;

la comparación < se realiza de acuerdo con las reglas de de_DE, porque la expresión combina una ordenación derivada implícitamente con la ordenación por defecto. Pero en:

SELECT a < ('foo' COLLATE "fr_FR") FROM test1;

la comparación se realiza utilizando las reglas de fr_FR, porque la derivación de ordenamiento explícita anula la implícita. Además, dado:

SELECT a < b FROM test1;

el analizador no puede determinar qué ordenamiento aplicar, ya que las columnas a y b tienen ordenaciones implícitas en conflicto. Dado que el operador < sí necesita saber qué ordenamiento utilizar, esto dará como resultado un error. El error se puede resolver añadiendo un especificador de ordenamiento explícito a cualquiera de las expresiones de entrada, de esta manera:

SELECT a < b COLLATE "de_DE" FROM test1;

o de manera equivalente:

SELECT a COLLATE "de_DE" < b FROM test1;

Por otro lado, el caso estructuralmente similar:

SELECT a || b FROM test1;

no produce un error, porque al operador || no le importan las ordenaciones: su resultado es el mismo independientemente de la ordenación.

También se considera que el ordenamiento asignado a las expresiones de entrada combinadas de una función u operador se aplica al resultado de la función u operador, si este entrega un resultado de un tipo de datos ordenable. Así, en:

SELECT * FROM test1 ORDER BY a || 'foo';

la ordenación se realizará de acuerdo con las reglas de de_DE. Pero esta consulta:

SELECT * FROM test1 ORDER BY a || b;

produce un error, porque aunque el operador || no necesita saber una ordenación, la cláusula ORDER BY sí. Como antes, el conflicto se puede resolver con un especificador de ordenamiento explícito:

SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";

23.2.2. Gestión de ordenaciones #

Una ordenación es un objeto de esquema SQL que mapea un nombre SQL a las configuraciones regionales proporcionadas por las bibliotecas instaladas en el sistema operativo. La definición de una ordenación tiene un proveedor (provider) que especifica qué biblioteca proporciona los datos de la configuración regional. Un nombre de proveedor estándar es libc, que utiliza las configuraciones regionales proporcionadas por la biblioteca C del sistema operativo. Estas son las configuraciones regionales utilizadas por la mayoría de las herramientas proporcionadas por el sistema operativo. Otro proveedor es icu, que utiliza la biblioteca externa ICU. Las ordenaciones de ICU solo se pueden utilizar si se configuró el soporte para ICU cuando se compiló PostgreSQL.

Un objeto de ordenación proporcionado por libc se mapea a una combinación de los ajustes LC_COLLATE y LC_CTYPE, tal como los acepta la llamada a la biblioteca del sistema setlocale(). (Como el nombre indica, el propósito principal de un ordenamiento es establecer LC_COLLATE, que controla el orden de clasificación. Pero en la práctica rara vez es necesario tener un ajuste de LC_CTYPE que sea diferente de LC_COLLATE, por lo que es más conveniente agruparlos bajo un solo concepto que crear otra infraestructura para establecer LC_CTYPE por expresión). Además, un ordenamiento de libc está vinculado a una codificación de juego de caracteres (consulta Section 23.3). El mismo nombre de ordenamiento puede existir para diferentes codificaciones.

Un objeto de ordenación proporcionado por icu se mapea a un ordenador con nombre proporcionado por la biblioteca ICU. ICU no admite ajustes de «collate» y «ctype» separados, por lo que siempre son iguales. Además, las ordenaciones de ICU son independientes de la codificación, por lo que siempre hay una sola ordenación de ICU con un nombre dado en una base de datos.

23.2.2.1. Ordenaciones estándar #

En todas las plataformas, se admiten las siguientes ordenaciones:

unicode

Esta ordenación estándar de SQL se ordena utilizando el Algoritmo de Ordenamiento Unicode con la Tabla de Elementos de Ordenamiento Unicode por Defecto. Está disponible en todas las codificaciones. Se requiere soporte de ICU para utilizar esta ordenación, y el comportamiento puede cambiar si PostgreSQL se compila con una versión diferente de ICU. (Esta ordenación tiene el mismo comportamiento que la configuración regional raíz de ICU; consulta und-x-icu (para undefined)).

ucs_basic

Esta ordenación estándar de SQL se ordena utilizando los valores de los puntos de código Unicode en lugar del orden del lenguaje natural, y solo las letras ASCII de la A a la Z se tratan como letras. El comportamiento es eficiente y estable en todas las versiones. Solo está disponible para la codificación UTF8. (Esta ordenación tiene el mismo comportamiento que la especificación de configuración regional de libc C en la codificación UTF8).

pg_unicode_fast

Esta ordenación se clasifica por los valores de los puntos de código Unicode en lugar del orden del lenguaje natural. Para las funciones lower, initcap y upper utiliza el mapeo completo de mayúsculas/minúsculas de Unicode. Para la coincidencia de patrones (incluidas las expresiones regulares), utiliza la variante Estándar de las Propiedades de compatibilidad de Unicode. El comportamiento es eficiente y estable dentro de una versión principal de Postgres. Solo está disponible para la codificación UTF8.

pg_c_utf8

Esta ordenación se clasifica por los valores de los puntos de código Unicode en lugar del orden del lenguaje natural. Para las funciones lower, initcap y upper, utiliza el mapeo simple de mayúsculas/minúsculas de Unicode. Para la coincidencia de patrones (incluidas las expresiones regulares), utiliza la variante compatible con POSIX de las Propiedades de compatibilidad de Unicode. El comportamiento es eficiente y estable dentro de una versión principal de PostgreSQL. Esta ordenación solo está disponible para la codificación UTF8.

C (equivalente a POSIX)

Las ordenaciones C y POSIX se basan en el comportamiento tradicional de C. Se clasifican por valores de bytes en lugar de por el orden del lenguaje natural, y solo las letras ASCII de la A a la Z se tratan como letras. El comportamiento es eficiente y estable en todas las versiones para una codificación de base de datos dada, pero el comportamiento puede variar entre diferentes codificaciones de base de datos.

default

La ordenación default selecciona la configuración regional especificada al momento de la creación de la base de datos.

Pueden estar disponibles ordenaciones adicionales dependiendo del soporte del sistema operativo. La eficiencia y estabilidad de estas ordenaciones adicionales dependen del proveedor de la ordenación, de la versión del proveedor y de la configuración regional.

23.2.2.2. Ordenaciones predefinidas #

Si el sistema operativo proporciona soporte para utilizar múltiples configuraciones regionales dentro de un solo programa (newlocale y funciones relacionadas), o si está configurado el soporte para ICU, entonces cuando se inicializa un clúster de bases de datos, initdb puebla el catálogo del sistema pg_collation con ordenaciones basadas en todas las configuraciones regionales que encuentra en el sistema operativo en ese momento.

Para inspeccionar las ordenaciones disponibles actualmente, utiliza la consulta SELECT * FROM pg_collation, o el comando \dOS+ en psql.

23.2.2.2.1. Ordenaciones de libc #

Por ejemplo, el sistema operativo podría proporcionar una configuración regional llamada de_DE.utf8. initdb crearía entonces una ordenación llamada de_DE.utf8 para la codificación UTF8 que tiene tanto LC_COLLATE como LC_CTYPE establecidos en de_DE.utf8. También creará una ordenación con la etiqueta .utf8 eliminada del nombre. Así, también podrías utilizar la ordenación bajo el nombre de_DE, que es menos complicado de escribir y hace que el nombre sea menos dependiente de la codificación. Ten en cuenta que, sin embargo, el conjunto inicial de nombres de ordenación depende de la plataforma.

El conjunto por defecto de ordenaciones proporcionadas por libc se mapea directamente a las configuraciones regionales instaladas en el sistema operativo, que se pueden listar utilizando el comando locale -a. En caso de que se necesite una ordenación de libc que tenga valores diferentes para LC_COLLATE y LC_CTYPE, o si se instalan nuevas configuraciones regionales en el sistema operativo después de que se inicializó el sistema de base de datos, se puede crear una nueva ordenación utilizando el comando CREATE COLLATION. Las nuevas configuraciones regionales del sistema operativo también se pueden importar en masa utilizando la función pg_import_system_collations().

Dentro de cualquier base de datos en particular, solo interesan las ordenaciones que utilizan la codificación de esa base de datos. Se ignoran las demás entradas en pg_collation. Por lo tanto, un nombre de ordenamiento simplificado como de_DE se puede considerar único dentro de una base de datos dada, aunque no fuera único a nivel global. Se recomienda el uso de nombres de ordenamiento simplificados, ya que hará que haya una cosa menos que cambiar si decides cambiar a otra codificación de base de datos. Sin embargo, ten en cuenta que las ordenaciones default, C y POSIX se pueden utilizar independientemente de la codificación de la base de datos.

PostgreSQL considera que los objetos de ordenación distintos son incompatibles incluso cuando tienen propiedades idénticas. Así, por ejemplo:

SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;

generará un error a pesar de que las ordenaciones C y POSIX tienen comportamientos idénticos. Por lo tanto, no se recomienda mezclar nombres de ordenación simplificados y no simplificados.

23.2.2.2.2. Ordenaciones de ICU #

Con ICU, no es sensato enumerar todos los nombres de configuración regional posibles. ICU utiliza un sistema de nomenclatura particular para las configuraciones regionales, pero hay muchas más formas de nombrar una configuración regional que configuraciones regionales realmente distintas. initdb utiliza las API de ICU para extraer un conjunto de configuraciones regionales distintas para poblar el conjunto inicial de ordenaciones. Las ordenaciones proporcionadas por ICU se crean en el entorno SQL con nombres en formato de etiqueta de idioma BCP 47, con una extensión de «uso privado» -x-icu añadida, para distinguirlas de las configuraciones regionales de libc.

Aquí hay algunos ejemplos de ordenaciones que podrían crearse:

de-x-icu #

Ordenamiento en alemán, variante por defecto

de-AT-x-icu #

Ordenamiento en alemán para Austria, variante por defecto

(También existen, por ejemplo, de-DE-x-icu o de-CH-x-icu, pero al momento de escribir este documento, son equivalentes a de-x-icu).

und-x-icu (para undefined) #

Ordenamiento raíz de ICU. Utiliza esto para obtener un orden de clasificación razonable e independiente del idioma.

Algunas codificaciones (menos utilizadas) no son compatibles con ICU. Cuando la codificación de la base de datos es una de estas, se ignoran las entradas de ordenación de ICU en pg_collation. Intentar utilizar una generará un error similar a el ordenamiento "de-x-icu" para la codificación "WIN874" no existe.

23.2.2.3. Creación de nuevos objetos de ordenación #

Si las ordenaciones estándar y predefinidas no son suficientes, los usuarios pueden crear sus propios objetos de ordenación utilizando el comando SQL CREATE COLLATION.

Las ordenaciones estándar y predefinidas están en el esquema pg_catalog, como todos los objetos predefinidos. Las ordenaciones definidas por el usuario deben crearse en los esquemas de usuario. Esto también garantiza que sean guardadas por pg_dump.

23.2.2.3.1. Ordenaciones de libc #

Las nuevas ordenaciones de libc se pueden crear así:

CREATE COLLATION german (provider = libc, locale = 'de_DE');

Los valores exactos que son aceptables para la cláusula locale en este comando dependen del sistema operativo. En sistemas de tipo Unix, el comando locale -a mostrará una lista.

Dado que las ordenaciones predefinidas de libc ya incluyen todas las ordenaciones definidas en el sistema operativo cuando se inicializa la instancia de la base de datos, no suele ser necesario crearlas manualmente. Las razones podrían ser si se desea un sistema de nomenclatura diferente (en cuyo caso consulta también Section 23.2.2.3.3) o si el sistema operativo se ha actualizado para proporcionar nuevas definiciones de configuración regional (en cuyo caso consulta también pg_import_system_collations()).

23.2.2.3.2. Ordenaciones de ICU #

Las ordenaciones de ICU se pueden crear de la siguiente manera:

CREATE COLLATION german (provider = icu, locale = 'de-DE');

Las configuraciones regionales de ICU se especifican como una etiqueta de idioma BCP 47, pero también pueden aceptar la mayoría de los nombres de configuración regional de estilo libc. Si es posible, los nombres de configuración regional de estilo libc se transforman en etiquetas de idioma.

Las nuevas ordenaciones de ICU pueden personalizar ampliamente el comportamiento del ordenamiento al incluir atributos de ordenación en la etiqueta de idioma. Consulta Section 23.2.3 para obtener detalles y ejemplos.

23.2.2.3.3. Copiado de ordenaciones #

El comando CREATE COLLATION también se puede utilizar para crear una nueva ordenación a partir de una ordenación existente, lo cual puede ser útil para poder utilizar nombres de ordenación independientes del sistema operativo en las aplicaciones, crear nombres de compatibilidad o utilizar una ordenación proporcionada por ICU bajo un nombre más legible. Por ejemplo:

CREATE COLLATION german FROM "de_DE";
CREATE COLLATION french FROM "fr-x-icu";

23.2.2.4. Ordenaciones no determinadas #

Un ordenamiento es determinado (deterministic) o no determinado (nondeterministic). Un ordenamiento determinado utiliza comparaciones determinadas, lo que significa que considera que las cadenas son iguales solo si constan de la misma secuencia de bytes. La comparación no determinada puede determinar que las cadenas son iguales incluso si constan de bytes diferentes. Las situaciones típicas incluyen la comparación insensible a mayúsculas y minúsculas, la comparación insensible a los acentos, así como la comparación de cadenas en diferentes formas normales de Unicode. Corresponde al proveedor de la ordenación implementar realmente tales comparaciones insensibles; la bandera determinada solo determina si los empates deben resolverse utilizando la comparación por bytes. Consulta también el Estándar Técnico de Unicode #10 para obtener más información sobre la terminología.

Para crear una ordenación no determinada, especifica la propiedad deterministic = false en CREATE COLLATION, por ejemplo:

CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);

Este ejemplo utilizaría la ordenación estándar de Unicode de manera no determinada. En particular, esto permitiría comparar correctamente cadenas en diferentes formas normales. Los ejemplos más interesantes hacen uso de las facilidades de personalización de ICU explicadas anteriormente. Por ejemplo:

CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);

Todas las ordenaciones estándar y predefinidas son determinadas, y todas las ordenaciones definidas por el usuario son determinadas por defecto. Aunque las ordenaciones no determinadas ofrecen un comportamiento más correcto, especialmente cuando se considera todo el poder de Unicode y sus muchos casos especiales, también tienen algunos inconvenientes. Principalmente, su uso conlleva una penalización en el rendimiento. Ten en cuenta, en particular, que B-tree no puede utilizar la deduplicación con índices que utilicen una ordenación no determinada. Además, ciertas operaciones no son posibles con ordenaciones no determinadas, como algunas operaciones de coincidencia de patrones. Por lo tanto, deben utilizarse únicamente en los casos en que se deseen específicamente.

Tip

Para tratar texto en diferentes formas de normalización Unicode, también existe la opción de utilizar las funciones/expresiones normalize e is normalized para preprocesar o verificar las cadenas, en lugar de utilizar ordenaciones no determinadas. Existen diferentes ventajas y desventajas para cada enfoque.

23.2.3. Ordenaciones personalizadas de ICU #

ICU permite un control amplio sobre el comportamiento de la ordenación al definir nuevas ordenaciones con ajustes de ordenación como parte de la etiqueta de idioma. Estos ajustes pueden modificar el orden de clasificación para adaptarse a una variedad de necesidades. Por ejemplo:

-- ignorar las diferencias en los acentos y las mayúsculas/minúsculas
CREATE COLLATION ignore_accent_case (provider = icu, deterministic = false, locale = 'und-u-ks-level1');
SELECT 'Å' = 'A' COLLATE ignore_accent_case; -- true
SELECT 'z' = 'Z' COLLATE ignore_accent_case; -- true

-- las letras mayúsculas se ordenan antes que las minúsculas.
CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper');
SELECT 'B' < 'b' COLLATE upper_first; -- true

-- tratar los dígitos numéricamente e ignorar la puntuación
CREATE COLLATION num_ignore_punct (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-kn');
SELECT 'id-45' < 'id-123' COLLATE num_ignore_punct; -- true
SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true

Muchas de las opciones disponibles se describen en Section 23.2.3.2, o bien consulta Section 23.2.3.5 para obtener más detalles.

23.2.3.1. Niveles de comparación de ICU #

La comparación de dos cadenas (ordenación) en ICU se determina mediante un proceso de múltiples niveles, donde las características textuales se agrupan en «niveles». El tratamiento de cada nivel se controla mediante los ajustes de ordenación. Los niveles más altos corresponden a características textuales más finas.

La Table 23.1 muestra qué diferencias de características textuales se consideran significativas al determinar la igualdad en el nivel dado. El carácter Unicode U+2063 es un separador invisible y, como se ve en la tabla, se ignora en todos los niveles de comparación inferiores a identic.

Table 23.1. Niveles de ordenamiento de ICU

NivelDescripción'f' = 'f''ab' = U&'a\2063b''x-y' = 'x_y''g' = 'G''n' = 'ñ''y' = 'z'
level1Carácter basetruetruetruetruetruefalse
level2Acentostruetruetruetruefalsefalse
level3Mayúsculas/Variantestruetruetruefalsefalsefalse
level4Puntuación[a]truetruefalsefalsefalsefalse
identicTodotruefalsefalsefalsefalsefalse

[a] solo con ka-shifted; consulta la Table 23.2


En cada nivel, incluso con la normalización completa desactivada, se realiza una normalización básica. Por ejemplo, 'á' puede estar compuesta por los puntos de código U&'\0061\0301' o por el único punto de código U&'\00E1', y esas secuencias se considerarán iguales incluso en el nivel identic. Para tratar cualquier diferencia en la representación del punto de código como distinta, utiliza una ordenación creada con deterministic establecido en true.

23.2.3.1.1. Ejemplos de niveles de ordenamiento #
CREATE COLLATION level3 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level3');
CREATE COLLATION level4 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level4');
CREATE COLLATION identic (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-identic');

-- separador invisible ignorado en todos los niveles excepto en identic
SELECT 'ab' = U&'a\2063b' COLLATE level4; -- true
SELECT 'ab' = U&'a\2063b' COLLATE identic; -- false

-- puntuación ignorada en level3 pero no en level 4
SELECT 'x-y' = 'x_y' COLLATE level3; -- true
SELECT 'x-y' = 'x_y' COLLATE level4; -- false

23.2.3.2. Ajustes de ordenación para una configuración regional de ICU #

La Table 23.2 muestra los ajustes de ordenación disponibles, que se pueden utilizar como parte de una etiqueta de idioma para personalizar una ordenación.

Table 23.2. Ajustes de ordenación de ICU

ClaveValoresPor defectoDescripción
coemoji, phonebk, standard, ...standard Tipo de ordenamiento. Consulta Section 23.2.3.5 para ver opciones y detalles adicionales.
kanoignore, shiftednoignore Si se establece en shifted, hace que algunos caracteres (por ejemplo, signos de puntuación o espacios) se ignoren en la comparación. La clave ks debe estar establecida en level3 o inferior para que surta efecto. Establece la clave kv para controlar qué clases de caracteres se ignoran.
kbtrue, falsefalse Comparación inversa para las diferencias de nivel 2. Por ejemplo, la configuración regional und-u-kb ordena 'àe' antes de 'aé'.
kctrue, falsefalse

Separa las mayúsculas y minúsculas en un «nivel 2.5» que se sitúa entre los acentos y otras características del nivel 3.

Si se establece en true y ks se establece en level1, se ignorarán los acentos pero se tendrán en cuenta las mayúsculas y minúsculas.

kf upper, lower, false false Si se establece en upper, las mayúsculas se ordenan antes que las minúsculas. Si se establece en lower, las minúsculas se ordenan antes que las mayúsculas. Si se establece en false, la ordenación depende de las reglas de la configuración regional.
kntrue, falsefalse Si se establece en true, los números dentro de una cadena se tratan como un único valor numérico en lugar de como una secuencia de dígitos. Por ejemplo, 'id-45' se ordena antes de 'id-123'.
kktrue, falsefalse

Habilitar la normalización completa; puede afectar al rendimiento. La normalización básica se realiza incluso cuando se establece en false. Las configuraciones regionales para idiomas que requieren una normalización completa normalmente la habilitan por defecto.

La normalización completa es importante en algunos casos, como cuando se aplican múltiples acentos a un solo carácter. Por ejemplo, las secuencias de puntos de código U&'\0065\0323\0302' y U&'\0065\0302\0323' representan una e con acentos circunflejo y punto abajo aplicados en diferentes órdenes. Con la normalización completa activada, estas secuencias de puntos de código se tratan como iguales; de lo contrario, no son iguales.

kr space, punct, symbol, currency, digit, script-id  

Establecer en uno o más de los valores válidos, o en cualquier script-id de BCP 47, por ejemplo latn («latino») o grek («griego»). Los valores múltiples se separan por «-».

Redefine el ordenamiento de las clases de caracteres; los caracteres que pertenecen a una clase anterior en la lista se ordenan antes que los caracteres que pertenecen a una clase posterior en la lista. Por ejemplo, el valor digit-currency-space (como parte de una etiqueta de idioma como und-u-kr-digit-currency-space) ordena la puntuación antes de los dígitos y los espacios.

kslevel1, level2, level3, level4, identiclevel3 Sensibilidad (o «fuerza») al determinar la igualdad, siendo level1 el menos sensible a las diferencias e identic el más sensible a las diferencias. Consulta la Table 23.1 para obtener detalles.
kv space, punct, symbol, currency punct Clases de caracteres ignoradas durante la comparación en el nivel 3. Al establecer un valor posterior se incluyen los valores anteriores; por ejemplo, symbol también incluye punct y space en los caracteres a ignorar. La clave ka debe estar establecida en shifted y la clave ks debe estar establecida en level3 o inferior para que surta efecto.

Los valores por defecto pueden depender de la configuración regional. La tabla anterior no pretende estar completa. Consulta la Section 23.2.3.5 para obtener opciones y detalles adicionales.

Note

Para muchos ajustes de ordenación, debes crear la ordenación con deterministic establecido en false para que el ajuste tenga el efecto deseado (consulta la Section 23.2.2.4). Además, algunos ajustes solo surten efecto cuando la clave ka se establece en shifted (consulta la Table 23.2).

23.2.3.3. Ejemplos de ajustes de ordenación #

CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk'); #

Ordenamiento en alemán con el tipo de ordenación de guía telefónica

CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji'); #

Ordenamiento raíz con el tipo de ordenamiento de Emoji, según el Estándar Técnico de Unicode #51

CREATE COLLATION latinlast (provider = icu, locale = 'en-u-kr-grek-latn'); #

Ordena las letras griegas antes que las latinas. (El comportamiento por defecto es las latinas antes que las griegas).

CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); #

Ordena las letras mayúsculas antes que las minúsculas. (El comportamiento por defecto es las letras minúsculas primero).

CREATE COLLATION special (provider = icu, locale = 'en-u-kf-upper-kr-grek-latn'); #

Combina las dos opciones anteriores.

23.2.3.4. Reglas de adaptación de ICU #

Si las opciones proporcionadas por los ajustes de ordenación mostrados anteriormente no son suficientes, el orden de los elementos de ordenación se puede cambiar con reglas de adaptación (tailoring rules), cuya sintaxis se detalla en https://unicode-org.github.io/icu/userguide/collation/customization/.

Este pequeño ejemplo crea una ordenación basada en la configuración regional raíz con una regla de adaptación:

CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');

Con esta regla, la letra W se ordena después de la V, pero se trata como una diferencia secundaria similar a un acento. Reglas como esta están contenidas en las definiciones de configuración regional de algunos idiomas. (Por supuesto, si una definición de configuración regional ya contiene las reglas deseadas, no es necesario especificarlas explícitamente de nuevo).

Aquí hay un ejemplo más complejo. La siguiente sentencia configura una ordenación llamada ebcdic con reglas para ordenar caracteres US-ASCII en el orden de la codificación EBCDIC.

CREATE COLLATION ebcdic (provider = icu, locale = 'und',
rules = $$
& ' ' < '.' < '<' < '(' < '+' < \|
< '&' < '!' < '$' < '*' < ')' < ';'
< '-' < '/' < ',' < '%' < '_' < '>' < '?'
< '`' < ':' < '#' < '@' < \' < '=' < '"'
<*a-r < '~' <*s-z < '^' < '[' < ']'
< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9
$$);

SELECT c
FROM (VALUES ('a'), ('b'), ('A'), ('B'), ('1'), ('2'), ('!'), ('^')) AS x(c)
ORDER BY c COLLATE ebcdic;
 c
---
 !
 a
 b
 ^
 A
 B
 1
 2

23.2.3.5. Referencias externas para ICU #

Esta sección (Section 23.2.3) es solo una breve descripción general del comportamiento de ICU y de las etiquetas de idioma. Consulta los siguientes documentos para conocer los detalles técnicos, las opciones adicionales y los nuevos comportamientos: