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.
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 podporují porovnávání nerozlišující velká a malá písmena, nerozlišují se diakritiky a koncové porovnání nerozlišující mezery a řazení řetězců pracujících s jazykem.
Řetězce v Azure Databricks jsou reprezentovány jako UTF-8 kódované ZnakyUnicode. Ve výchozím nastavení Azure Databricks porovnává řetězce podle jejich binární reprezentace UTF-8, označované jako UTF8_BINARY kolace.
UTF8_BINARY porovnání jsou v mnoha případech rychlá a vhodná, ale nemusí být vhodná pro aplikace, které vyžadují řazení nebo porovnání s podporou jazyka.
Kromě binárních porovnání se běžný případ použití nerozlišuje malá a velká písmena. Kolace UTF8_LCASE je určena pro tento účel. Před porovnáním řetězců UTF8_BINARYpřevede řetězce na malá písmena.
Pro porovnání s jazykem Azure Databricks používá následující technologie:
- Knihovna International Components for Unicode (ICU) pro výpočet kolace.
- Běžné tabulky CLDR (Locale Data Repository) pro kolaci pracující s národním prostředím
- Interní kódování kolací pomocí jazyka Unicode Locale Data Markup Language (LDML)
Tyto technologie jsou zapouzdřené v sadě pojmenovaných kolací, které jsou k dispozici pro použití 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í
Azure Databricks poskytuje pojmenované kolace systému pro zjednodušení identifikace. Specifikace LDML mohou být složité pro čtení a použití přímo.
Syntaxe
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI | RTRIM }
UTF8_BINARYBinární kolace, která porovnává bajtové bajty řetězců na základě jejich reprezentace UTF-8.
UTF8_BINARYje výchozí nastavení systému pro kolaci session a nejjednodušší kolaci v Azure Databricks.V této kolaci:
'A'(x'65') <'B'(x'66') < ... <'Z'(x'90'). ('Z'x'90') (x'97')<'a'a'A'(x'65') <>'a'(x'97'). Znaky jako'Ä'(x'C384') jsou větší než obě'Z'a'z'.UTF8_LCASEJednoduchá kolace nerozlišující velká a malá písmena, která před porovnáním pomocí
UTF8_BINARYpřevede řetězce na malá písmena .UTF8_LCASEje kolace použitá pro Identifiers v Azure Databricks.Například:
ORDER BY col COLLATE UTF8_LCASEodpovídá:
ORDER BY LOWER(col) COLLATE UTF8_BINARYUNICODEKořenové národní prostředí ICU, známé v CLDR jako
rootnárodní prostředí (specifikace LDML:und-u). Tato kolace používá pořadí nezávislé na jazyce, které seskupuje podobné znaky dohromady. Příklad:'a'<'A'<'Ä'<'b'. Tato kolace ve výchozím nastavení rozlišují malá a velká písmena a rozlišují se na malá a velká písmena.localeKolace pracující s národním prostředím 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ě. Hodnoty národního prostředí nerozlišují 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 .
-
modifierŘídí citlivost písmen, zvýraznění citlivosti a koncové chování mezery. Modifikátory nerozlišují malá a velká písmena a lze je zadat v libovolném pořadí.
-
CS:Case-sensitive. Výchozí chování. -
CI:Case-insensitive. -
AS: Zvýraznění citlivé. Výchozí chování. -
AI: Nerozlišující zvýraznění.
Platí pro:
Databricks SQL
Databricks Runtime 16.2 a vyšší-
RTRIM: Koncová mezera nerozlišuje. Před porovnáním oříznou koncové mezery (u0020).
Platí pro:
Databricks SQL
Databricks Runtime 16.2 a vyššíMůžete zadat
RTRIM, maximálně jeden zCSneboCI, a maximálně jeden zASneboAI.-
Když Azure Databricks zpracuje název kolace, normalizuje název odebráním výchozích hodnot. Například SR_CYR_SRN_CS_AS normalizuje do SR.
Seznam podporovaných kolací najdete v tématu Podporované kolace.
Příklady
-- Fully qualified collation names are supported; case doesn't matter.
system.builtin.unicode
-- All collations are system-defined and do not require qualification.
unicode
-- Two-letter language code for German collation.
DE
-- Two-letter language code and three-letter country code for French Canadian collation.
fr_CAN
-- Two-letter language code, four-letter script code, and three-letter country code
-- for Traditional Chinese in Macao.
zh_Hant_MAC
-- German collation with case-insensitive and accent-insensitive modifiers.
-- 'Ä', 'A', and 'a' are all considered equal.
de_CI_AI
-- Backticks are allowed but not required for built-in collations.
`UTF8_BINARY`
Porovnání UTF8_LCASE a kolace UNICODE
UTF8_LCASE Kolace založené na kódování UNICODE, jako UNICODE_CI jsou a UNICODE_CI_AI podporují porovnávání nerozlišující malá a velká písmena, ale liší se v tom, jak zpracovávají zvýrazňující znaky a pravidla specifická pro národní prostředí.
Rozdíly v chování
UTF8_LCASE převede řetězce na malá písmena a porovná je bajt bytem pomocí UTF8_BINARY. Je odlehčená a rychlá, ale zpracovává znaky s diakritikou odlišnou od jejich neaktucentovaných forem.
Kolace založené na kódování UNICODE používají knihovnu ICU a data národního prostředí CLDR.
CI Modifikátory AI to rozšiřují tak, aby se znaky chovali jako ekvivalentní i v případě, že se liší v případě, zvýraznění nebo obojím. Tyto kolace jsou důkladnější, ale mají vyšší výpočetní náklady.
| Chování | UTF8_LCASE |
UNICODE_CI |
UNICODE_CI_AI |
|---|---|---|---|
'A' = 'a' |
true |
true |
true |
'Café' = 'café' |
true |
true |
true |
'Cafe' = 'Café' |
false |
false |
true |
'ß' = 'ss' (Německé ostrý s) |
false |
false |
false |
'resume' = 'résumé' |
false |
false |
true |
Podporuje LIKE a RLIKE |
Ano | Ne | Ne |
| Podporuje pravidla specifická pro národní prostředí. | Ne | Ano | Ano |
Kdy použít každou kolaci
Používá se
UTF8_LCASEpro rychlé porovnávání bez rozlišování velkých a malých písmen, pokud by znaky s diakritikou měly zůstat odlišné. Tato kolace je vhodná pro migrace datového skladu ze systémů, které používají jednoduché porovnávání řetězců bez rozlišování malých a velkých písmen.Používá se
UNICODE_CIpro porovnávání bez rozlišování velkých a malých písmen, která dodržují pravidla Unicode, zejména pokud data obsahují znaky z více jazyků, kde jednoduché malá písmena nestačí.Použijte
UNICODE_CI_AI, když se mají ignorovat rozdíly velkých a malých a velkých písmen. Například pokud by se hledání"resume"mělo shodovat"résumé". To je běžné v uživatelských vyhledávacích a vícejazyčných aplikacích.
Příklady
-- UTF8_LCASE lowercases then compares bytes.
-- Accented and unaccented characters are not equivalent.
> SELECT 'Cafe' = 'café' COLLATE UTF8_LCASE;
false
> SELECT 'Café' = 'café' COLLATE UTF8_LCASE;
true
-- UNICODE_CI is case-insensitive but accent-sensitive.
-- 'Café' equals 'café' (case differs) but not 'Cafe' (accent differs).
> SELECT 'Café' = 'cafe' COLLATE UNICODE_CI;
false
> SELECT 'Café' = 'café' COLLATE UNICODE_CI;
true
-- UNICODE_CI_AI is case-insensitive and accent-insensitive.
-- 'Café' matches 'cafe' because both case and accent differences are ignored.
> SELECT 'Cafe' = 'café' COLLATE UNICODE_CI_AI;
true
> SELECT 'resume' = 'résumé' COLLATE UNICODE_CI_AI;
true
-- UTF8_LCASE sorts by lowercase byte order.
-- UNICODE collations sort by linguistic similarity.
> SELECT col FROM VALUES('Banana'), ('apple'), ('Ångström'), ('äpfel') AS t(col)
ORDER BY col COLLATE UTF8_LCASE;
apple
Banana
Ångström
äpfel
> SELECT col FROM VALUES('Banana'), ('apple'), ('Ångström'), ('äpfel') AS t(col)
ORDER BY col COLLATE UNICODE_CI;
apple
Ångström
äpfel
Banana
Výchozí třídění
Výchozí kolace se vztahuje na STRING literály, značky parametrů, funkce bez STRING parametrů, které vytvářejí řetězce a sloupce, pole nebo definice typu proměnné bez COLLATE klauzule.
Výchozí kolace je odvozena takto:
Pro příkazy DDL, jako
ALTER TABLEjsou ,CREATE VIEW,CREATE PROCEDURECREATE TABLE, aCREATE FUNCTION:- Výchozí kolace je výchozí kolace objektu, který se vytváří nebo mění.
- Pokud není zadaná žádná
DEFAULT COLLATIONklauzule, zdědí se výchozí kolace z obsahujícího schématu.
U příkazů DML (
UPDATE,DELETE FROM, ,INSERTMERGE INTO) a Query je výchozí kolace relace, kterou můžete změnit pomocí SET příkazu COLLATION. Výchozí nastavení systému pro kolaci relace jeUTF8_BINARY.
Priorita řazení
Azure Databricks použije pravidla priority kolace k určení toho, která kolace se má pro daný řetězec použít. Jsou definovány čtyři úrovně priority:
Explicitní
Kolace je explicitně přiřazena pomocí
collatevýrazu.-- Force 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 názvem sloupce, názvem pole, aliasem sloupce, názvem proměnné nebo odkazem na název parametru , včetně výsledku poddotazů, kde kolace není Žádná.
-- Use the collation of the column as defined. employee.name LIKE 'Mc%' -- Use the collation of the variable as defined. translate(session.tempvar, 'Z', ',')Výchozí
Literál
STRING, pojmenované nebo nepojmenované značky parametrů neboSTRINGvytvořené funkcí z jiného typu.-- A literal string has the default collation. 'Hello' -- :parm1 is a parameter marker using the session default collation. EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1; -- ? is a parameter marker using the session default collation. EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello'; -- The result of casting a non-STRING to STRING uses 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') -- session_user() returns a STRING with the default collation. session_user()Přiřazená kolace je výchozí kolace.
Žádný
STRINGVýsledek funkce, operátoru nebo operace sady, jakoUNIONje například to, že přebírá více než jedenSTRINGargument s různými implicitními kolacemi.-- 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 explicit collations results in no collation. SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
Odvození kolace
Při odvození kolace pro STRING výsledek se pravidla priority použijí takto:
Pokud výraz odpovídá jedné z výše uvedených definic, kolace a priorita jsou definovány.
Pokud je výraz funkcí nebo operátorem s jedním
STRINGparametrem, kterýSTRINGvrací parametr , kolace a priorita jsou parametrySTRING.Pokud je výraz funkcí nebo operátorem se dvěma nebo více
STRINGparametry:Pokud mají všechny parametry stejnou kolaci a prioritu, výsledek použije kolaci a prioritu.
Pokud mají parametry různou kolaci nebo prioritu, nechte
C1C2a buďte odlišné kolace aDbuďte výchozí kolací. Výsledek je určen 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
-- A function that modifies 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 German collides with implicit French; the result has 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
-- Explicit collation wins over no collation.
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
IT
-- Implicit collation (English) does not win over None.
> SELECT collation(en || (fr || de)) FROM words;
null
-- Explicit collation (English) wins over implicit collation anywhere in the expression.
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
EN
Omezení
Mnoho funkcí porovnávání vzorů a regulárních výrazů podporuje pouze UTF8_BINARY a UTF8_LCASE kolace. Azure Databricks vyvolá chybu při použití těchto funkcí s jinými kolacemi, jako jsou UNICODE nebo kolace specifické pro národní prostředí, jako jsou DE nebo FR_CI_AI.
Ovlivněné funkce zahrnují LIKE, ILIKE, RLIKEa regexp_* rodinu funkcí. Pro porovnávání řetězců u sloupců s jinými kolacemi použijte contains funkci, startswith funkci nebo endswith funkci.