Condividi tramite


Collazione

Importante

Questa funzionalità si trova in anteprima pubblica.

Si applica a:segno di spunta contrassegnato come sì Databricks Runtime 16.1 e versioni successive

Una collazione è un set di regole che determina come vengono eseguiti i confronti tra stringhe. Le collazioni vengono utilizzate per confrontare stringhe in modo insensibile al maiuscolo/minuscolo o agli accenti, oppure per ordinare stringhe in un ordine specifico sensibile alla lingua.

Le stringhe in Azure Databricks vengono rappresentate come UTF-8 codificate caratteri Unicode. Per impostazione predefinita, Azure Databricks confronta le stringhe in base alla rappresentazione UTF8 binaria. Questo è noto come collazione UTF8_BINARY. UTF8_BINARY I confronti sono veloci e appropriati in molti casi, ma potrebbero non essere adatti a tutte le applicazioni, in particolare quelle che richiedono l'ordinamento o i confronti tenendo conto della lingua.

Oltre ai confronti che tengono conto della lingua, un altro caso d'uso comune consiste nel richiedere confronti senza distinzione tra maiuscole e minuscole. Azure Databricks ha la collation UTF8_LCASE specificamente per questo scopo. Converte le stringhe in lettere minuscole prima di confrontarle usando la collazione veloce UTF8_BINARY.

Per i confronti con riconoscimento del linguaggio, Azure Databricks usa le tecnologie seguenti:

  • International Components for Unicode (ICU) libreria per calcolare la collazione
  • tables CLDR (Common Locale Data Repository) per ordinamento specifico sensibile alle impostazioni locali.
  • LDML (Unicode Locale Data Markup Language) per codificare internamente le regole di confronto.

Queste tecnologie vengono incapsulate in un set di regole di confronto denominate che possono essere usate nelle istruzioni SQL.

Nomi delle collazioni

Poiché l'identificazione delle regole di confronto in base alla specifica LDML può essere complessa e complessa da leggere, Azure Databricks ha un set di regole di confronto di sistema denominate più facili da usare.

Sintassi

{ UTF8_BINARY |
  UTF8_LCASE |
  { UNICODE | locale } [ _ modifier [...] ] }

locale
  language_code [ _ script_code ] [ _ country_code ]

modifier
  { CS | CI | AS | AI }
  • UTF8_BINARY

    Una collazione binaria meta-locale che confronta le stringhe byte per byte in base alla rappresentazione di byte UTF-8. UTF8_BINARY è la regola di confronto predefinita e più leggera per il confronto tra stringhe in Azure Databricks.

    In questa collazione 'A' (x'65') < 'B' (x'66') < ... < 'Z' (x'90').

    Tuttavia, 'Z' (x'90') < 'a' (x'97') e 'A' (x'65') <> 'a' (x'97').

    Inoltre, i caratteri come "Ä" (x'C384') sono maggiori di "Z" e "z" in questa collazione.

  • UTF8_LCASE

    Una collazione meta-locale leggera insensibile al maiuscolo/minuscolo che confronta le stringhe utilizzando la loro rappresentazione in byte UTF-8, dopo averle convertite in minuscolo.

    UTF8_LCASE è la regola di confronto usata per gli identificatori in Azure Databricks.

    Per esempio:

    ORDER BY col COLLATE UTF8_LCASE
    

    equivale a

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Localizzazione radice dell'ICU.

    Queste regole di confronto, note in CLDR come impostazioni locali 'root' (specifica LDML: 'und-u') impongono un ordine indipendente dal linguaggio, che tenta di essere intuitivo nel complesso. In questa collazione, i caratteri come e sono raggruppati. Ad esempio: 'a' < 'A' < 'Ä' < 'b'. 'A' non è considerato equivalente a 'a'. Di conseguenza, la collatione distingue tra maiuscole e minuscole. 'a' non è considerato equivalente a 'ä'. Pertanto, le regole di confronto sono sensibili all'accento.

  • impostazioni locali

    Una collazione consapevole delle impostazioni locali basata sul CLDR tables.

    Le impostazioni locali sono specificate come codice linguistico, codice script facoltativo e codice paese facoltativo. locale non fa distinzione tra maiuscole e minuscole.

    • language_code: codice linguistico ISO 639-1 a due lettere.
    • script_code: codice di script ISO 15924 a quattro lettere.
    • country_code: un codice paese a tre lettere ISO 3166-1 alfa-3.
  • modificatore

    Specifica il comportamento delle regole di confronto riguardo alla sensibilità alle maiuscole e agli accenti.

    • CS: Case-sensitive. Comportamento predefinito.
    • ci: senza distinzione di maiuscole/minuscole.
    • AS: Sensibile agli accenti. Comportamento predefinito.
    • AI: senza distinzione tra caratteri accentati e non accentati.

    È possibile specificare CS o CIe AS o AI al massimo una volta e in qualsiasi ordine. I modificatori stessi non fanno distinzione tra maiuscole e minuscole.

Quando si elaborano regole di confronto, Azure Databricks normalizza i nomi delle regole di confronto rimuovendo le impostazioni predefinite. Ad esempio, SR_CYR_SRN_CS_AS viene normalizzato in SR.

Per una list di regole di confronto supportate, vedere Regole di confronto supportate.

Esempi

-- 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`

Regole di confronto predefinite

Le regole di confronto predefinite si applicano quando si usano valori letterali STRING, marcatori di parametro, funzioni che non STRINGparameters producono stringhe e quando si definiscono tipi di campo o variabile columnsenza una clausola COLLATE.

La collatione predefinita è derivata in UTF8_BINARY.

Precedenza di confronto

Per decidere quali regole di confronto usare per una determinata stringa Azure Databricks definisce le regole di precedenza delle regole di confronto.

Le regole assegnano 4 livelli di precedenza alle collazioni.

  1. Esplicito

    Le regole di confronto sono state assegnate in modo esplicito a una stringa usando l'espressione COLLATE ().

    esempi

    -- 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. implicito

    Le regole di confronto vengono assegnate in modo implicito dal campo column, , column-alias, variabile, o dal parametro di routine riferimento. Ciò include il risultato di una sottoquery purché l'ordinamento non sia Nessuno.

    esempi

    -- 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. Predefinita

    Valore letterale STRING, marcatore di parametro nominato o non nominato, o STRING prodotto da una funzione di un altro tipo.

    esempi

    -- 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()
    

    La collazione assegnata è la collazione predefinita .

  4. Nessuna

    Un risultato STRING di una funzione, operatore o operazione set (ad esempio, UNION) che accetta più di un argomento STRING con diverse regole di confronto implicite.

    esempi

    -- 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
    

Derivazione della collazione

Quando si deriva la collazione per un risultato STRING, le regole di precedenza della collazione vengono applicate nei modi seguenti.

Se l'espressione:

  1. corrisponde alle definizioni precedenti

    Le regole di confronto e la precedenza sono già definite.

  2. è una funzione o un operatore con un singolo parametro STRING, restituendo un STRING

    Le regole di confronto e la precedenza sono quelle del parametro STRING.

  3. è una funzione o un operatore con due o più STRINGparameters

    1. con le stesse regole di confronto e precedenza

      L'ordinamento e la precedenza sono di STRINGparameters.

    2. con ordinamenti o regole di precedenza diversi

      Siano C1 e C2 regole di confronto distinte e sia D la regola di confronto predefinita. La precedenza e l'ordinamento sono determinati dal tableseguente:

      Regole di confronto e precedenza C1 Esplicito C1 Implicito D Predefinito Nessuno
      C2 espliciti Errore C2 Esplicito C2 Esplicito C2 Esplicito
      C2 implicito C1 esplicito Nessuno C2 Implicit Nessuno
      D predefinita C1 Esplicito C1 Implicito D Predefinito Nessuno
      Nessuna C1 Esplicito Nessuno Nessuno Nessuno

Esempi

> 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