Sdílet prostřednictvím


Kolace

Důležitý

Tato funkce je ve verzi Public Preview.

platí pro:zaškrtněte políčko Ano Databricks Runtime 16.1 a novější

Řazení je sada pravidel, která určují, jak se provádí porovnávání řetězců. Kolace se používají k porovnání řetězců bez rozlišování velkých a malých písmen nebo přízvuků, nebo k jejich řazení v pořadí podle určitého jazykového uspořádání.

Řetězce v Azure Databricks jsou reprezentovány jako UTF-8 kódované znaky Unicode. 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í zohledňujících jazyk je běžným případem použití požadovat porovnání nezávislé na velikosti 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 nabízí sadu snadněji použitelných pojmenovaných systémových kolací.

Syntax

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

locale
  language_code [ _ script_code ] [ _ country_code ]

modifier
  { CS | CI | AS | AI }
  • 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 tomto třídění „A“ (x’65’) < „B“ (x’66’) < … < 'Z' (x'90').

    Ale "Z" (x'90') < "a" (x'97') a "A" (x'65') <> "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á" lokalita (specifikace LDML: 'und-u'), představuje jazykově nezávislé pořadí, které se snaží být celkově intuitivní. V této kolaci jsou seskupené znaky jako a. Pří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í nastavení 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átoru

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

    • CS: Rozlišování velkých a malých písmen. Výchozí chování.
    • CI: Nerozlišují malá a velká písmena.
    • AS: rozlišování diakritiky. Výchozí chování.
    • AI: Nerozlišování diakritiky.

    Můžete zadat 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í kolace

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 v 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 k řetězci prostřednictvím 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í

    Seřazení je implicitně přiřazeno sloupci, poli, aliasu sloupce, proměnnénebo parametru rutiny. To zahrnuje výsledek poddotazu, pokud kolace není None.

    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í

    STRING literál s názvem nebo bez názvu 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 množinové operace (např. UNION), která přebírá více než jeden STRING argument, které mají 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

      Řazení a priorita jsou takové, jaké mají 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 řazení jsou určeny následující tabulkou:

      Kolace a pořadí C1 Explicitní Implicitní jazyk C1 Výchozí hodnota D Žádný
      C2 explicitní Chyba Explicitní jazyk C2 Explicitní jazyk C2 Explicitní jazyk C2
      C2 implicitní Explicitní C1 Žádný Implicitní jazyk C2 Žádný
      D výchozí C1 Explicitní Implicitní jazyk C1 Výchozí nastavení D Žádný
      Žádné C1 Zřejmý Žádný Žádný Žádný

Příklady

> 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