Sdílet prostřednictvím


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 se používají k porovnání řetězců bez rozlišování velkých a malých písmen, bez rozlišování přízvuků či koncových mezer, nebo k řazení řetězců ve specifickém pořadí podle jazyka.

Řetězce v Azure Databricks jsou reprezentované jako znaky Unicode s kódováním UTF-8. Azure Databricks ve výchozím nastavení porovnává řetězce podle jejich binární reprezentace UTF8. Toto se označuje jako seřazení UTF8_BINARY. UTF8_BINARY porovnání fungují v mnoha případech rychle a jsou vhodná, ale nemusí být ideální pro všechny aplikace, zejména pro ty, které vyžadují řazení nebo porovnání s podporou jazyka.

Kromě porovnání s podporou jazyka je běžným případem použití vynucení nerozlišování velkých a malých písmen. Azure Databricks má kolaci UTF8_LCASE speciálně pro tento účel. Před porovnáním převede řetězce na malá písmena pomocí rychlé kolace UTF8_BINARY.

Pro porovnání s podporou jazyka využívá Azure Databricks následující technologie:

Tyto technologie jsou zapouzdřené v sadě pojmenovaných kolací, které lze použít 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í

Vzhledem k tomu, že identifikace kolací podle specifikace LDML může být složitá a náročná na čtení, Azure Databricks má sadu snadno použitelných pojmenovaných systémových kolací.

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 meta místního nastavení, která porovnává řetězce bajt po bajtu na základě reprezentace bajtů ve formátu UTF-8. UTF8_BINARY je výchozí a nejlehčí kolace pro porovnání řetězců v Azure Databricks.

    V této kolaci „A“ (x'65') < „B“ (x'66') < ... < Z (x'90').

    Nicméně, 'Z' (x'90') je menší než 'a' (x'97') a 'A' (x'65') je také menší než 'a' (x'97').

    Dále jsou znaky jako Ä (x'C384') větší než "Z" a "z" v této kolaci.

  • UTF8_LCASE

    Porovnává řetězce pomocí jejich reprezentace bajtů UTF-8 po převodu řetězců na malá písmena, jednoduché třídění bez rozlišení velkých a malých písmen v rámci meta-locale.

    UTF8_LCASE je kolace používaná pro identifikátory v Azure Databricks.

    Například:

    ORDER BY col COLLATE UTF8_LCASE
    

    je ekvivalentní

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Kořenové prostředí ICU.

    Tato kolace, která se v CLDR označuje jako "kořenová" národní prostředí (specifikace LDML: 'und-u'), představuje pořadí nezávislé na jazyce, které se snaží být celkově intuitivní. V této kolaci jsou seskupené podobné znaky. Například: a' 'A' << 'Ä' < 'b'. "A" se nepovažuje za ekvivalent "a". Třídění je proto citlivé na velikost písmen. "a" se nepovažuje za ekvivalent "ä". Řazení je proto citlivé na přízvuk.

  • lokalita

    Řazení zohledňující místní prostředí 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ě. locale nerozlišuje malá a velká písmena.

  • modifikátor

    Určuje chování kolace týkající se citlivosti na malá a velká písmena a citlivosti na přízvuk.

    • CS: Rozlišující velikost písmen. Výchozí chování.
    • CI: Nerozlišují se malá a velká písmena.
    • AS: Citlivý na přízvuk. Výchozí chování.
    • AI: Necitlivé na přízvuky.

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

    • RTRIM: Koncové mezery jsou ignorovány. 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, CS nebo CIa AS nebo AI najednou a v libovolném pořadí. Samotné modifikátory nerozlišují malá a velká písmena.

Při zpracování kolace Azure Databricks normalizuje názvy kolací odebráním výchozích hodnot. Například SR_CYR_SRN_CS_AS je normalizován na SR.

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

Příklady

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

Výchozí třídění

Výchozí kolace platí při použití STRING literálů, značek parametrů, funkcí bez STRING parametrů vytvářejících řetězce a při definování sloupců, polí nebo typů proměnných bez klauzule COLLATE.

Výchozí kolace je odvozena jedním z následujících způsobů:

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

    • Výchozí kolace je výchozí kolace objektu, který se vytváří nebo mění.
    • Pokud není zadána žádná klauzule DEFAULT COLLATION, je výchozí kolace UTF8_BINARY.
  • Pro DML (UPDATE, DELETE FROM, INSERT, MERGE INTO) a Dotaz výchozí kolace je UTF8_BINARY.

Priorita řazení

Pokud chcete rozhodnout, která kolace se má použít pro daný řetězec, Azure Databricks definuje pravidla priority kolace.

Pravidla přiřazují kolacím 4 úrovně přednosti.

  1. Explicitní

    Kolace byla explicitně přiřazena řetězci pomocí collate výrazu.

    Příklady

    -- 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. 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 . To zahrnuje výsledek poddotazu, pokud kolace není Žádná.

    Příklady

    -- 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. Výchozí

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

    Příklady

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

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

  4. Žádný

    Výsledek STRING funkce, operátoru nebo operace množiny (např. UNION) přebírá více než jeden STRING argument, který má různé implicitní kolace.

    Příklady

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

Odvození kolace

Při odvození kolace pro výsledek STRING se pravidla priority kolace použijí následujícími způsoby:

Pokud výraz:

  1. odpovídá výše uvedeným definicám.

    Řazení a priorita jsou definovány.

  2. je funkce nebo operátor s jedním parametrem STRING, který vrací STRING

    Třídění a priorita jsou dle parametru STRING.

  3. je funkce nebo operátor se dvěma nebo více parametry STRING.

    1. se stejnými kolacemi a prioritou

      Uspořádání a pořadí je dáno parametry STRING.

    2. s různými kolacemi nebo prioritou

      Předpokládejme, že C1 a C2 jsou různé kolace a D je výchozí kolace. Priorita a seřazení jsou určeny 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

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

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