Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Důležitý
Tato funkce je ve verzi Public Preview.
Platí pro:
Databricks SQL
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:
- Pro výpočet kolace knihovna International Components for Unicode (ICU)
- Tabulky Common Locale Data Repository (CLDR) pro konkrétní kolaci zohledňující národní prostředí
- Interní kódování kolací pomocí jazyka Unicode Locale Data Markup Language (LDML)
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_BINARYje 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_LCASEje kolace používaná pro identifikátory v Azure Databricks.Například:
ORDER BY col COLLATE UTF8_LCASEje ekvivalentní
ORDER BY LOWER(col) COLLATE UTF8_BINARYUNICODE
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ě.
localenerozlišuje malá a velká písmena.- language_code: Dvoumísmenný kód jazyka ISO 639-1 .
- script_code: Čtyřmísmenný kód skriptu ISO 15924 .
- country_code: Třímísmenný kód země ISO 3166-1 alfa-3 .
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:
Databricks SQL
Databricks Runtime 16.2 a vyšší- RTRIM: Koncové mezery jsou ignorovány. Před porovnáním oříznou koncové mezery ('u0020').
Platí pro:
Databricks SQL
Databricks Runtime 16.2 a vyššíMůžete zadat
RTRIM,CSneboCIaASneboAInajednou 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 TABLEaCREATE 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í kolaceUTF8_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.
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 DEImplicitní
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', ',')Výchozí
Literál
STRING, pojmenovaná nebo nepojmenovaná značka parametru 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
STRINGfunkce, operátoru nebo operace množiny (např.UNION) přebírá více než jedenSTRINGargument, 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:
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íSTRINGTří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
Uspořádání a pořadí je dáno parametry
STRING.s různými kolacemi nebo prioritou
Předpokládejme, že
C1aC2jsou různé kolace aDje 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