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.
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:
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.
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.
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";
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.
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.
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.
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.
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”.
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.
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()).
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.
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";
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.
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.
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.
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
| Nivel | Descripción | 'f' = 'f' | 'ab' = U&'a\2063b' | 'x-y' = 'x_y' | 'g' = 'G' | 'n' = 'ñ' | 'y' = 'z' |
|---|---|---|---|---|---|---|---|
| level1 | Carácter base | true | true | true | true | true | false |
| level2 | Acentos | true | true | true | true | false | false |
| level3 | Mayúsculas/Variantes | true | true | true | false | false | false |
| level4 | Puntuación[a] | true | true | false | false | false | false |
| identic | Todo | true | false | false | false | false | false |
[a] solo con | |||||||
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.
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
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
| Clave | Valores | Por defecto | Descripción |
|---|---|---|---|
co | emoji, phonebk, standard, ... | standard | Tipo de ordenamiento. Consulta Section 23.2.3.5 para ver opciones y detalles adicionales. |
ka | noignore, shifted | noignore |
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.
|
kb | true, false | false |
Comparación inversa para las diferencias de nivel 2. Por ejemplo, la configuración regional und-u-kb ordena
'àe' antes de 'aé'.
|
kc | true, false | false |
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 |
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.
|
kn | true, false | false |
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'.
|
kk | true, false | false |
Habilitar la normalización completa; puede afectar al rendimiento. La normalización básica se realiza incluso cuando se establece
en
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 |
kr |
space, punct,
symbol, currency,
digit, script-id
|
Establecer en uno o más de los valores válidos, o en cualquier
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 | |
ks | level1, level2, level3, level4, identic | level3 |
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.
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).
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.
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
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: