Kolace
Důležitý
Tato funkce je ve verzi Public Preview.
platí pro: 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:
- International Components for Unicode (ICU) knihovna pro výpočet řazení
- tabulky CLDR (Common Locale Data Repository) pro konkrétní kolaci pracující s národním prostředím.
- kódování Unicode Locale Data Markup Language (LDML) pro interní kódování kolací.
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.- language_code: Dvoumísmenný kód jazyka ISO 639-1.
- script_code: Čtyřpísmenný kód skriptu ISO 15924.
- country_code: Třímístný kód země ISO 3166-1 alfa-3.
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
neboCI
aAS
neboAI
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.
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
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', ',')
výchozí
STRING
literál s názvem nebo bez názvu značky parametrůneboSTRING
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.
Žádné
Výsledek
STRING
funkce, operátoru nebo množinové operace (např.UNION
), která přebírá více než jedenSTRING
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:
odpovídá výše uvedeným definicám.
Řazení a priorita jsou definovány.
je funkce nebo operátor s jedním parametrem
STRING
, který vracíSTRING
Třídění a priorita jsou dle parametru
STRING
.je funkce nebo operátor se dvěma nebo více parametry
STRING
.se stejnými kolacemi a prioritou
Řazení a priorita jsou takové, jaké mají parametry
STRING
.s různými kolacemi nebo prioritou
Předpokládejme, že
C1
aC2
jsou různé kolace aD
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
Související
- sestavit výraz
- kolace
- funkce tabulky kolace