Compartilhar via


Colação

Importante

Este recurso está em Public Preview .

Aplica-se a:marcado como sim 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:

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-1 de duas letras.
    • script_code: Um código de script ISO 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 ou CIe AS ou AI 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:

  1. 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
    
  2. 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', ',')
    
  3. Padrão

    Um STRING marcador de parâmetro literal, nomeado ou nãoou um STRING 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.

  4. Nenhum

    Um STRING resultado de uma função, operador ou operação de conjunto (por exemplo, UNION) que aceita mais de um argumento STRING 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:

  1. corresponde às definições acima

    O agrupamento e a precedência são conforme definidos.

  2. é uma função ou operador com um único parâmetro STRING, retornando um STRING

    O agrupamento e a precedência são os do parâmetro STRING.

  3. é uma função ou operador com dois ou mais parâmetros STRING

    1. com as mesmas colações e precedência

      O agrupamento e a precedência são os dos parâmetros STRING.

    2. com diferentes ordenações ou precedência

      Que C1 e C2 sejam agrupamentos distintos e que D 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