Sdílet prostřednictvím


Kolace

Důležitý

Tato funkce je ve verzi Public Preview.

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.

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 ano Databricks SQL označeno 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 příkazy DML (UPDATE, DELETE, INSERT, MERGE) a dotazovací příkazy je výchozí kolace .

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í

    Řazení bylo explicitně přiřazeno k řetězci pomocí výrazu COLLATE.

    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 sloupcem , polem , aliasem sloupce , proměnnou nebo parametrem rutiny . 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čka parametru 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