Colação
Aplica-se a: Databricks Runtime 16.1 e versões posteriores
Um agrupamento é um conjunto de regras que determina como as comparações de cadeia de caracteres são executadas. Os agrupamentos são usados para comparar cadeias de caracteres de uma maneira que não diferencia maiúsculas de minúsculas ou acento ou para classificar cadeias de caracteres em uma ordem específica com reconhecimento de idioma.
As cadeias de caracteres no Azure Databricks são representadas como UTF-8 codificado caracteres Unicode.
Por padrão, o Azure Databricks compara cadeias de caracteres por sua representação binária UTF8. Isso é conhecido como agrupamento UTF8_BINARY
.
UTF8_BINARY
comparações são rápidas e apropriadas em muitos casos, mas podem não ser adequadas para todas as aplicações, especialmente aquelas que exigem classificação ou comparações com reconhecimento de idioma.
Além das comparações com reconhecimento de idioma, um caso de uso comum é exigir comparações que não diferenciam maiúsculas de minúsculas.
O Azure Databricks tem o agrupamento UTF8_LCASE
especificamente para essa finalidade.
Converte cadeias de caracteres em minúsculas antes de compará-las usando a ordenação UTF8_BINARY
rápida.
Para comparações com reconhecimento de idioma, o Azure Databricks emprega as seguintes tecnologias:
- Biblioteca de componentes internacionais para Unicode (ICU) para calcular ordenação
- CLDR (Common Locale Data Repository) tabelas para ordenação com reconhecimento de localidade específica.
- Unicode Locale Data Markup Language (LDML) para codificar ordenações internamente.
Essas tecnologias são encapsuladas em um conjunto de agrupamentos nomeados que podem ser usados em instruções SQL.
Nomes de agrupamento
Como a identificação de agrupamentos por sua especificação LDML pode ser complexa e difícil de ler, o Azure Databricks tem um conjunto de agrupamentos de sistema nomeados mais fáceis de usar.
Sintaxe
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI }
UTF8_BINARY
Um agrupamento binário de metalocalidade que compara cadeias de caracteres byte por byte com base na representação de bytes UTF-8.
UTF8_BINARY
é o agrupamento padrão e mais leve para comparação de cadeia de caracteres no Azure Databricks.Neste agrupamento «A» (x'65') < «B» (x'66') < ... < 'Z' (x'90').
No entanto, 'Z' (x'90') < 'a' (x'97'), e 'A' (x'65') <> 'a' (x'97').
Além disso, caracteres como 'Ä' (x'C384') são maiores que 'Z' e 'z' neste agrupamento.
UTF8_LCASE
Uma ordenação meta-local simples que não diferencia maiúsculas de minúsculas, comparando cadeias de caracteres usando sua representação de bytes UTF-8 depois de converter as cadeias de caracteres em minúsculas.
UTF8_LCASE
é a classificação usada para identificadores no Azure Databricks.Por exemplo:
ORDER BY col COLLATE UTF8_LCASE
é equivalente a
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
A localidade raiz da UTI.
Este agrupamento, conhecido no CLDR como a localidade 'raiz' (especificação LDML: 'und-u') impõe uma ordem agnóstica de linguagem, que tenta ser intuitiva em geral. Neste agrupamento, caracteres como e são agrupados. Por exemplo: «a» < «A» < «Ä» < «b». «A» não é considerado equivalente a «a». Portanto, o agrupamento faz distinção entre maiúsculas e minúsculas. «a» não é considerado equivalente a «ä». Portanto, o agrupamento é sensível aos acentos.
localidade
Um agrupamento sensível à localidade baseado nas tabelas CLDR.
A localidade é especificada como um código de idioma, um código de script opcional e um código de país opcional.
locale
não diferencia maiúsculas de minúsculas.language_code : Um código linguístico ISO 639-1de duas letras. script_code : Um código de scriptISO 15924 de quatro letras. - country_code: Uma de três letras ISO 3166-1 alpha-3 código de país.
modificador
Especifica o comportamento de agrupamento em relação à sensibilidade a maiúsculas e minúsculas e à sensibilidade a acentos.
- CS: Sensível a maiúsculas e minúsculas. O comportamento padrão.
- CI: Não diferencia maiúsculas de minúsculas.
- AS: Sensível ao sotaque. O comportamento padrão.
- AI: Não sensível ao sotaque.
Você pode especificar
CS
ouCI
eAS
ouAI
no máximo uma vez e em qualquer ordem. Os modificadores em si não diferenciam maiúsculas de minúsculas.
Ao processar um agrupamento, o Azure Databricks normaliza os nomes de agrupamento removendo as configurações padrão.
Por exemplo, SR_CYR_SRN_CS_AS
é normalizado para SR
.
Para obter uma lista de agrupamentos suportados, consulte Agrupamentos suportados.
Exemplos
-- You can fully qualify collations, and case doesn't matter.
system.builtin.unicode
-- Since all collations are system defined you don't need to qualify them
unicode
-- Using 2-letter language code only for german collation
DE
-- Using 2-letter language code and 3-letter country code for french-canadian collation
-- It is common to use lower case 2-letter language codes and upper case 3-letter country codes
-- But collation names are case insensitive
fr_CAN
-- Using 2-letter language code and 4-letter script code and 3-letter country code for traditional chinese in Macao
zh-Hant-MAC
-- Using a 2 letter german language code and 2 modifiers for case insensitive and accent insensitive
-- So 'Ä', 'A', and 'a' are all considered equal
de_CI_AI
-- Using back ticks is allowed, but unnecessary for builtin collations
`UTF8_BINARY`
Ordenação padrão
A classificação padrão aplica-se ao usar literais de STRING
, marcadores de parâmetro, funções que produzem cadeias de caracteres sem parâmetros STRING
e ao definir tipos de coluna, campo ou variável sem uma cláusula COLLATE.
O agrupamento padrão é derivado em UTF8_BINARY
.
Precedência do agrupamento
Para decidir qual agrupamento usar para uma determinada cadeia de caracteres, o Azure Databricks define regras de precedência de agrupamento.
As regras atribuem 4 níveis de precedência aos agrupamentos:
explícito
A ordenação foi explicitamente atribuída a uma cadeia de caracteres usando a expressão COLLATE .
Exemplos
-- Force fast binary collation to check whether a vin matches a Ferrari vin COLLATE UTF8_BINARY LIKE 'ZFF%' -- Force German collation to order German first names ORDER BY vorname COLLATE DE
implícito
A ordenação é implicitamente atribuída pela coluna , campo , alias de coluna , variável , ou parâmetro de rotina referenciado por. Isso inclui o resultado de uma subconsulta, desde que o agrupamento não seja Nenhum.
Exemplos
-- Use the collation of the column as it was defined employee.name LIKE 'Mc%' -- Use the collation of the variable as it was defined. translate(session.tempvar, 'Z', ',')
Padrão
Um
STRING
marcador de parâmetro literal, nomeado ou nãoou umSTRING
produzido por uma função de outro tipo.Exemplos
-- A literal string has the default collation 'Hello' -- :parm1 is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1; -- ? is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello'; -- The result of a cast of a non-STRING to a STRING is a STRING with the default collation CAST(5 AS STRING) -- The date is converted to a string using the default collation to_char(DATE'2016-04-08', 'y') -- The collation of the session_user STRING is the default collation session_user()
O agrupamento atribuído é o Agrupamento Padrão.
Nenhum
Um
STRING
resultado de uma função, operador ou operação de conjunto (por exemplo,UNION
) que aceita mais de um argumentoSTRING
com diferentes classificações implícitas.Exemplos
-- Concatenating two strings with different explicit collations results in no collation SELECT fr || de AS freutsch FROM VALUES('Voulez vous ' COLLATE FR), 'Kartoffelsupp...' COLLATE DE) AS T(fr, de) -- A union of two strings with different excplicit collations results in no collation SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
Derivação de agrupamento
Ao derivar o agrupamento para um resultado de STRING
, as regras de precedência de agrupamento são aplicadas das seguintes maneiras:
Se a expressão:
corresponde às definições acima
O agrupamento e a precedência são conforme definidos.
é uma função ou operador com um único parâmetro
STRING
, retornando umSTRING
O agrupamento e a precedência são os do parâmetro
STRING
.é uma função ou operador com dois ou mais parâmetros
STRING
com as mesmas colações e precedência
O agrupamento e a precedência são os dos parâmetros
STRING
.com diferentes ordenações ou precedência
Que
C1
eC2
sejam agrupamentos distintos e queD
seja o agrupamento padrão. A precedência e o agrupamento são determinados pela tabela a seguir:Classificação e Precedência C1 Explícito C1 Implícito D Padrão Nenhum #C2 Explícito Erro C2 Explícito C2 Explícito C2 Explícito C2 implícito C1 explícito Nenhum C2 Implícito Nenhum D padrão C1 Explícito C1 Implícito D Padrão Nenhum Nenhum C1 Explícito Nenhum Nenhum Nenhum
Exemplos
> CREATE TABLE words(fr STRING COLLATE FR, de STRING COLLATE DE, en STRING COLLATE EN);
> INSERT INTO words VALUES ('Salut', 'Hallo', 'Hello');
-- A literal string has the default collation
> SELECT collation('Ciao');
UTF8_BINARY
-- A function producing a STRING has the default collation
> SELECT collation(user());
UTF8_BINARY
-- Function modifying a STRING passes the collation through
> SELECT collation(upper('Ciao'));
UTF8_BINARY
-- Implicit collation (French) wins over default collation
> SELECT collation(fr || 'Ciao') FROM words;
FR
-- Explicit collation (French) wins over implicit collation (German)
> SELECT collation('Salut' COLLATE FR || de) FROM words;
FR
-- Implicit collation German collides with implicit collation French
-- The result is no collation
> SELECT collation(de || fr) FROM words;
null
-- Explicit collation (French) wins over default collation (Italian)
> SELECT collation('Salut' COLLATE FR || 'Ciao');
FR
-- Explicit collation (French) collides with explicit collation (German)
> SELECT collation('Salut' COLLATE FR || 'Hallo' COLLATE DE);
COLLATION_MISMATCH.EXPLICIT
-- The explicit collation wins over no collation
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
UTF8_BINARY
-- The implict collation (English) does not win over None
> SELECT collation(en || (fr || de)) FROM words;
null
-- The explicit collation (English) wins over Implicit collation anywhere in the expression
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
EN