Zestawianie
Dotyczy:,,oraz, Databricks Runtime 16.1 i nowsze
Sortowanie to zestaw reguł określający sposób wykonywania porównań ciągów. Sortowania są używane do porównywania ciągów w sposób niewrażliwy na wielkość liter lub bez uwzględniania akcentu lub sortowania ciągów w określonej kolejności rozpoznawania języka.
Ciągi w usłudze Azure Databricks są reprezentowane jako znaki UTF-8 zakodowane unicode.
Domyślnie usługa Azure Databricks porównuje ciągi według ich binarnej reprezentacji UTF8. Jest to nazywane sortowaniem UTF8_BINARY
.
UTF8_BINARY
porównania są szybkie i odpowiednie w wielu przypadkach, ale mogą nie być właściwe dla wszystkich aplikacji, zwłaszcza tych, które wymagają sortowania lub porównań uwzględniających różnice językowe.
Oprócz porównań obsługujących język, typowym przypadkiem użycia jest wymaganie porównań bez uwzględniania wielkości liter.
Usługa Azure Databricks ma sortowanie UTF8_LCASE
specjalnie dla tego celu.
Konwertuje ciągi na małe litery przed porównaniem ich przy użyciu szybkiego sortowania UTF8_BINARY
.
W przypadku porównań obsługujących język usługa Azure Databricks wykorzystuje następujące technologie:
- International Components for Unicode (ICU) biblioteka do sortowania obliczeniowego
- Tabele Repozytorium Danych Ustawień Regionalnych (CLDR) do specyficznego sortowania uwzględniającego ustawienia regionalne.
- języka LDML (Locale Data Markup Language) unicode w celu kodowania sortowania wewnętrznego.
Te technologie są zawarte w zestawie nazwanych porządków, które mogą być używane w instrukcjach SQL.
Nazwy sortowania
Ponieważ identyfikowanie sortowań według ich specyfikacji LDML może być złożone i trudne do odczytania, usługa Azure Databricks oferuje zestaw nazwanych systemowych sortowań, które są łatwiejsze w użyciu.
Składnia
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI }
UTF8_BINARY
Sortowanie binarne meta-locale, które porównuje ciągi znaków bajt po bajcie na podstawie reprezentacji bajtów UTF-8.
UTF8_BINARY
jest domyślnym i najbardziej uproszczonym sortowaniem dla porównania ciągów w usłudze Azure Databricks.W tym zestawieniu 'A' (x'65') < 'B' (x'66') < ... < "Z" (x'90').
Jednak ‘Z’ (x’90’) < ‘a’ (x’97’), i ‘A’ (x’65’) <> ‘a’ (x’97’).
Ponadto znaki takie jak "Ä" (x'C384') są większe niż "Z" i "z" w tym sortowaniu.
UTF8_LCASE
Uproszczone sortowanie bez uwzględniania wielkości liter metadanych, które porównuje ciągi przy użyciu ich reprezentacji bajtów UTF-8 po przekonwertowaniu ciągów na małe litery.
UTF8_LCASE
to zestawienie używane do identyfikatorów w usłudze Azure Databricks.Na przykład:
ORDER BY col COLLATE UTF8_LCASE
jest odpowiednikiem
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
Ustawienia regionalne główne ICU.
To sortowanie, określane w CLDR jako lokalizacja "root" (specyfikacja LDML: "und-u"), nakłada porządek niezależny od języka, który ogólnie stara się być intuicyjny. W tej kolacji znaki takie jak i są grupowane. Na przykład: "a" < "A" < "Ä" < "b". "A" nie jest uważane za równoważne "a". W związku z tym sortowanie uwzględnia wielkość liter. "a" nie jest uważane za równoważne "ä". W związku z tym sortowanie jest wrażliwe na akcent.
ustawień regionalnych
Sortowanie obsługujące ustawienia regionalne oparte na tabelach CLDR.
Ustawienia regionalne są określane jako kod języka, opcjonalny kod skryptu i opcjonalny kod kraju.
locale
jest nieczuły na wielkość liter.- language_code: kod dwuliterowy języka ISO 639-1.
- script_code: czteroliterowy kod skryptu ISO 15924.
- country_code: trzyliterowy kod kraju ISO 3166-1 alfa- 3.
modyfikator
Określa zachowanie sortowania pod względem czułości na wielkość liter i czułości na akcenty.
- CS: Uwzględniana wielkość liter. Domyślne zachowanie.
- ciągłej integracji: bez uwzględniania wielkości liter.
- AS: wrażliwy na akcent. Domyślne zachowanie.
- Sztuczna inteligencja: niewrażliwa na akcenty.
Można określić
CS
lubCI
orazAS
lubAI
co najwyżej raz i w dowolnej kolejności. Te modyfikatory są niezależne od wielkości liter.
Podczas przetwarzania sortowania usługa Azure Databricks normalizuje nazwy sortowania, usuwając wartości domyślne.
Na przykład SR_CYR_SRN_CS_AS
jest znormalizowana do SR
.
Aby uzyskać listę obsługiwanych sortowania, zobacz Obsługiwane sortowania.
Przykłady
-- 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`
Sortowanie domyślne
Sortowanie domyślne ma zastosowanie podczas używania literałów STRING
, znaczników parametrów, funkcji bez STRING
parametrów tworzących ciągi oraz podczas definiowania typów kolumn, pól lub zmiennych bez klauzuli COLLATE.
Sortowanie domyślne jest określone w UTF8_BINARY
.
Pierwszeństwo sortowania
Aby zdecydować, które sortowanie ma być używane dla danego ciągu, usługa Azure Databricks definiuje reguły pierwszeństwa sortowania.
Reguły przypisują 4 poziomy pierwszeństwa do sortowania:
jawne
Sortowanie zostało jawnie przypisane do ciągu przy użyciu wyrażenia COLLATE.
Przykłady
-- 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
niejawna
Porządkowanie jest niejawnie przypisywane przez kolumnę , pole , alias kolumny , zmienną lub przez odwołanie parametru rutynowego . Obejmuje to wynik podzapytania, pod warunkiem że porządek sortowania nie jest None.
Przykłady
-- 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', ',')
domyślny
Literał
STRING
, znacznik parametru nazwany lub nieznany, lubSTRING
wygenerowany przez funkcję innego typu.Przykłady
-- 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()
Brak
Wynik
STRING
funkcji, operatora lub operacji zestawu (np.UNION
), która przyjmuje więcej niż jeden argumentSTRING
, który ma różne niejawne sortowania.Przykłady
-- 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
Tworzenie zasad sortowania
Podczas wyprowadzania sortowania dla wyniku STRING
reguły pierwszeństwa sortowania są stosowane w następujący sposób:
Jeśli wyrażenie:
pasuje do powyższych definicji
Sortowanie i pierwszeństwo są zdefiniowane.
jest funkcją lub operatorem z pojedynczym parametrem
STRING
, zwracającSTRING
Porządek sortowania i priorytety są określone przez parametr
STRING
.jest funkcją lub operatorem z co najmniej dwoma parametrami
STRING
z tym samym sortowaniem i kolejnością
Układ i pierwszeństwo odpowiadają parametrom
STRING
.z różnymi porządkowaniami lub priorytetem
Niech
C1
iC2
być odrębnymi sortowaniami, aD
być sortowaniem domyślnym. Pierwszeństwo i sortowanie są określane przez następującą tabelę:Kolejność i priorytet C1 Jawne C1 Niejawny D Domyślne Żaden C2 Jawne Błąd C2 Jawne C2 Wprost C2 Jawne C2 Niejawne Jawne C1 Żaden C2 Niejawne Żaden D domyślna C1 Jawne C1 Ukryty D Domyślne Żaden Brak C1 Jawne Żaden Żaden Żaden
Przykłady
> 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