Collazione
Importante
Questa funzionalità si trova in anteprima pubblica.
Si applica a: 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
oCI
eAS
oAI
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 STRING
parameters 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.
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
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', ',')
Predefinita
Valore letterale
STRING
, marcatore di parametro nominato o non nominato, oSTRING
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()
Nessuna
Un risultato
STRING
di una funzione, operatore o operazione set (ad esempio,UNION
) che accetta più di un argomentoSTRING
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:
corrisponde alle definizioni precedenti
Le regole di confronto e la precedenza sono già definite.
è una funzione o un operatore con un singolo parametro
STRING
, restituendo unSTRING
Le regole di confronto e la precedenza sono quelle del parametro
STRING
.è una funzione o un operatore con due o più
STRING
parameterscon le stesse regole di confronto e precedenza
L'ordinamento e la precedenza sono di
STRING
parameters.con ordinamenti o regole di precedenza diversi
Siano
C1
eC2
regole di confronto distinte e siaD
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