Kolace

Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime 16.1 a vyšší

Sada pravidel pro řazení určuje, jakým způsobem se porovnávají řetězce. Kolace podporují porovnávání nerozlišující velká a malá písmena, nerozlišují se diakritiky a koncové porovnání nerozlišující mezery a řazení řetězců pracujících s jazykem.

Řetězce v Azure Databricks jsou reprezentovány jako UTF-8 kódované ZnakyUnicode. Ve výchozím nastavení Azure Databricks porovnává řetězce podle jejich binární reprezentace UTF-8, označované jako UTF8_BINARY kolace. UTF8_BINARY porovnání jsou v mnoha případech rychlá a vhodná, ale nemusí být vhodná pro aplikace, které vyžadují řazení nebo porovnání s podporou jazyka.

Kromě binárních porovnání se běžný případ použití nerozlišuje malá a velká písmena. Kolace UTF8_LCASE je určena pro tento účel. Před porovnáním řetězců UTF8_BINARYpřevede řetězce na malá písmena.

Pro porovnání s jazykem Azure Databricks používá následující technologie:

Tyto technologie jsou zapouzdřené v sadě pojmenovaných kolací, které jsou k dispozici pro použití v příkazech SQL.

Poznámka:

Omezení při používání kolací s tabulkami Delta Lake najdete v tématu Omezení.

Názvy kolací

Azure Databricks poskytuje pojmenované kolace systému pro zjednodušení identifikace. Specifikace LDML mohou být složité pro čtení a použití přímo.

Syntaxe

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

locale
  language_code [ _ script_code ] [ _ country_code ]

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

    Binární kolace, která porovnává bajtové bajty řetězců na základě jejich reprezentace UTF-8. UTF8_BINARY je výchozí nastavení systému pro kolaci session a nejjednodušší kolaci v Azure Databricks.

    V této kolaci: 'A' (x'65') <'B' (x'66') < ... < 'Z' (x'90'). ( 'Z' x'90') (x'97')<'a'a 'A' (x'65') <>'a' (x'97'). Znaky jako 'Ä' (x'C384') jsou větší než obě 'Z' a 'z'.

  • UTF8_LCASE

    Jednoduchá kolace nerozlišující velká a malá písmena, která před porovnáním pomocí UTF8_BINARYpřevede řetězce na malá písmena .

    UTF8_LCASE je kolace použitá pro Identifiers v Azure Databricks.

    Například:

    ORDER BY col COLLATE UTF8_LCASE
    

    odpovídá:

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Kořenové národní prostředí ICU, známé v CLDR jako root národní prostředí (specifikace LDML: und-u). Tato kolace používá pořadí nezávislé na jazyce, které seskupuje podobné znaky dohromady. Příklad: 'a'<'A'<'Ä'<'b'. Tato kolace ve výchozím nastavení rozlišují malá a velká písmena a rozlišují se na malá a velká písmena.

  • locale

    Kolace pracující s národním prostředím založená na tabulkách CLDR. Národní prostředí je určeno jako kód jazyka, volitelný kód skriptu a volitelný kód země. Hodnoty národního prostředí nerozlišují malá a velká písmena.

  • modifier

    Řídí citlivost písmen, zvýraznění citlivosti a koncové chování mezery. Modifikátory nerozlišují malá a velká písmena a lze je zadat v libovolném pořadí.

    • CS:Case-sensitive. Výchozí chování.
    • CI:Case-insensitive.
    • AS: Zvýraznění citlivé. Výchozí chování.
    • AI: Nerozlišující zvýraznění.

    Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime 16.2 a vyšší

    • RTRIM: Koncová mezera nerozlišuje. Před porovnáním oříznou koncové mezery (u0020).

    Platí pro:označeno jako ano Databricks SQL označeno jako ano Databricks Runtime 16.2 a vyšší

    Můžete zadat RTRIM, maximálně jeden z CS nebo CI, a maximálně jeden z AS nebo AI.

Když Azure Databricks zpracuje název kolace, normalizuje název odebráním výchozích hodnot. Například SR_CYR_SRN_CS_AS normalizuje do SR.

Seznam podporovaných kolací najdete v tématu Podporované kolace.

Příklady

-- Fully qualified collation names are supported; case doesn't matter.
system.builtin.unicode

-- All collations are system-defined and do not require qualification.
unicode

-- Two-letter language code for German collation.
DE

-- Two-letter language code and three-letter country code for French Canadian collation.
fr_CAN

-- Two-letter language code, four-letter script code, and three-letter country code
-- for Traditional Chinese in Macao.
zh_Hant_MAC

-- German collation with case-insensitive and accent-insensitive modifiers.
-- 'Ä', 'A', and 'a' are all considered equal.
de_CI_AI

-- Backticks are allowed but not required for built-in collations.
`UTF8_BINARY`

Porovnání UTF8_LCASE a kolace UNICODE

UTF8_LCASE Kolace založené na kódování UNICODE, jako UNICODE_CI jsou a UNICODE_CI_AI podporují porovnávání nerozlišující malá a velká písmena, ale liší se v tom, jak zpracovávají zvýrazňující znaky a pravidla specifická pro národní prostředí.

Rozdíly v chování

UTF8_LCASE převede řetězce na malá písmena a porovná je bajt bytem pomocí UTF8_BINARY. Je odlehčená a rychlá, ale zpracovává znaky s diakritikou odlišnou od jejich neaktucentovaných forem.

Kolace založené na kódování UNICODE používají knihovnu ICU a data národního prostředí CLDR. CI Modifikátory AI to rozšiřují tak, aby se znaky chovali jako ekvivalentní i v případě, že se liší v případě, zvýraznění nebo obojím. Tyto kolace jsou důkladnější, ale mají vyšší výpočetní náklady.

Chování UTF8_LCASE UNICODE_CI UNICODE_CI_AI
'A' = 'a' true true true
'Café' = 'café' true true true
'Cafe' = 'Café' false false true
'ß' = 'ss' (Německé ostrý s) false false false
'resume' = 'résumé' false false true
Podporuje LIKE a RLIKE Ano Ne Ne
Podporuje pravidla specifická pro národní prostředí. Ne Ano Ano

Kdy použít každou kolaci

  • Používá se UTF8_LCASE pro rychlé porovnávání bez rozlišování velkých a malých písmen, pokud by znaky s diakritikou měly zůstat odlišné. Tato kolace je vhodná pro migrace datového skladu ze systémů, které používají jednoduché porovnávání řetězců bez rozlišování malých a velkých písmen.

  • Používá se UNICODE_CI pro porovnávání bez rozlišování velkých a malých písmen, která dodržují pravidla Unicode, zejména pokud data obsahují znaky z více jazyků, kde jednoduché malá písmena nestačí.

  • Použijte UNICODE_CI_AI , když se mají ignorovat rozdíly velkých a malých a velkých písmen. Například pokud by se hledání "resume" mělo shodovat "résumé". To je běžné v uživatelských vyhledávacích a vícejazyčných aplikacích.

Příklady

-- UTF8_LCASE lowercases then compares bytes.
-- Accented and unaccented characters are not equivalent.
> SELECT 'Cafe' = 'café' COLLATE UTF8_LCASE;
  false

> SELECT 'Café' = 'café' COLLATE UTF8_LCASE;
  true

-- UNICODE_CI is case-insensitive but accent-sensitive.
-- 'Café' equals 'café' (case differs) but not 'Cafe' (accent differs).
> SELECT 'Café' = 'cafe' COLLATE UNICODE_CI;
  false

> SELECT 'Café' = 'café' COLLATE UNICODE_CI;
  true

-- UNICODE_CI_AI is case-insensitive and accent-insensitive.
-- 'Café' matches 'cafe' because both case and accent differences are ignored.
> SELECT 'Cafe' = 'café' COLLATE UNICODE_CI_AI;
  true

> SELECT 'resume' = 'résumé' COLLATE UNICODE_CI_AI;
  true

-- UTF8_LCASE sorts by lowercase byte order.
-- UNICODE collations sort by linguistic similarity.
> SELECT col FROM VALUES('Banana'), ('apple'), ('Ångström'), ('äpfel') AS t(col)
    ORDER BY col COLLATE UTF8_LCASE;
  apple
  Banana
  Ångström
  äpfel

> SELECT col FROM VALUES('Banana'), ('apple'), ('Ångström'), ('äpfel') AS t(col)
    ORDER BY col COLLATE UNICODE_CI;
  apple
  Ångström
  äpfel
  Banana

Výchozí třídění

Výchozí kolace se vztahuje na STRING literály, značky parametrů, funkce bez STRING parametrů, které vytvářejí řetězce a sloupce, pole nebo definice typu proměnné bez COLLATE klauzule.

Výchozí kolace je odvozena takto:

  • Pro příkazy DDL, jako ALTER TABLEjsou , CREATE VIEW, CREATE PROCEDURECREATE TABLE, a CREATE FUNCTION:

    • Výchozí kolace je výchozí kolace objektu, který se vytváří nebo mění.
    • Pokud není zadaná žádná DEFAULT COLLATION klauzule, zdědí se výchozí kolace z obsahujícího schématu.
  • U příkazů DML (UPDATE, DELETE FROM, , INSERTMERGE INTO) a Query je výchozí kolace relace, kterou můžete změnit pomocí SET příkazu COLLATION. Výchozí nastavení systému pro kolaci relace je UTF8_BINARY.

Priorita řazení

Azure Databricks použije pravidla priority kolace k určení toho, která kolace se má pro daný řetězec použít. Jsou definovány čtyři úrovně priority:

  1. Explicitní

    Kolace je explicitně přiřazena pomocí collate výrazu.

    -- Force 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. Implicitní

    Kolace je implicitně přiřazena názvem sloupce, názvem pole, aliasem sloupce, názvem proměnné nebo odkazem na název parametru , včetně výsledku poddotazů, kde kolace není Žádná.

    -- Use the collation of the column as defined.
    employee.name LIKE 'Mc%'
    
    -- Use the collation of the variable as defined.
    translate(session.tempvar, 'Z', ',')
    
  3. Výchozí

    Literál STRING , pojmenované nebo nepojmenované značky parametrů nebo STRING vytvořené funkcí z jiného typu.

    -- A literal string has the default collation.
    'Hello'
    
    -- :parm1 is a parameter marker using the session default collation.
    EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1;
    
    -- ? is a parameter marker using the session default collation.
    EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello';
    
    -- The result of casting a non-STRING to STRING uses 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')
    
    -- session_user() returns a STRING with the default collation.
    session_user()
    

    Přiřazená kolace je výchozí kolace.

  4. Žádný

    STRING Výsledek funkce, operátoru nebo operace sady, jako UNION je například to, že přebírá více než jeden STRING argument s různými implicitními kolacemi.

    -- 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 explicit collations results in no collation.
    SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
    

Odvození kolace

Při odvození kolace pro STRING výsledek se pravidla priority použijí takto:

  1. Pokud výraz odpovídá jedné z výše uvedených definic, kolace a priorita jsou definovány.

  2. Pokud je výraz funkcí nebo operátorem s jedním STRING parametrem, který STRINGvrací parametr , kolace a priorita jsou parametry STRING .

  3. Pokud je výraz funkcí nebo operátorem se dvěma nebo více STRING parametry:

    1. Pokud mají všechny parametry stejnou kolaci a prioritu, výsledek použije kolaci a prioritu.

    2. Pokud mají parametry různou kolaci nebo prioritu, nechte C1C2 a buďte odlišné kolace a D buďte výchozí kolací. Výsledek je určen následující tabulkou:

Kolace a pořadí C1 Explicitní Implicitní jazyk C1 Výchozí hodnota D Žádný
Explicitní jazyk C2 Chyba Explicitní jazyk C2 Explicitní jazyk C2 Explicitní jazyk C2
Implicitní jazyk C2 Explicitní C1 Žádný Implicitní jazyk C2 Žádný
Výchozí hodnota D C1 Explicitní Implicitní jazyk C1 Výchozí hodnota D Žádný
Žádný C1 Explicitní Žádný Žádný Žádný

Příklady

> SELECT 'hello' = 'hello   ' COLLATE UNICODE_RTRIM;
  true

> 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

-- A function that modifies 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 German collides with implicit French; the result has 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

-- Explicit collation wins over no collation.
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
  IT

-- Implicit collation (English) does not win over None.
> SELECT collation(en || (fr || de)) FROM words;
  null

-- Explicit collation (English) wins over implicit collation anywhere in the expression.
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
  EN

Omezení

Mnoho funkcí porovnávání vzorů a regulárních výrazů podporuje pouze UTF8_BINARY a UTF8_LCASE kolace. Azure Databricks vyvolá chybu při použití těchto funkcí s jinými kolacemi, jako jsou UNICODE nebo kolace specifické pro národní prostředí, jako jsou DE nebo FR_CI_AI.

Ovlivněné funkce zahrnují LIKE, ILIKE, RLIKEa regexp_* rodinu funkcí. Pro porovnávání řetězců u sloupců s jinými kolacemi použijte contains funkci, startswith funkci nebo endswith funkci.