Collatie
Belangrijk
Deze functie bevindt zich in openbare preview-versie.
Van toepassing op: Databricks Runtime 16.1 en hoger
Een collatie is een set regels die bepaalt hoe tekenreeksvergelijkingen worden uitgevoerd. Sorteringen worden gebruikt om tekenreeksen te vergelijken op een niet-hoofdlettergevoelige of niet-accentgevoelige manier of om tekenreeksen in een specifieke taalbewuste volgorde te sorteren.
Tekenreeksen in Azure Databricks worden weergegeven als UTF-8 gecodeerde Unicode-characters.
Standaard vergelijkt Azure Databricks tekenreeksen met hun binaire UTF8-weergave. Dit wordt UTF8_BINARY
-collatie genoemd.
UTF8_BINARY
vergelijkingen zijn in veel gevallen snel en geschikt, maar zijn mogelijk niet geschikt voor alle toepassingen, met name voor toepassingen waarvoor taalbewuste sortering of vergelijkingen nodig zijn.
Afgezien van taalbewuste vergelijkingen is een veelvoorkomende gebruikssituatie het vereisen van hoofdletterongevoelige vergelijkingen.
Azure Databricks heeft de UTF8_LCASE
-collatie speciaal voor dit doel.
Hiermee worden tekenreeksen geconverteerd naar lowercase voordat ze worden vergeleken met behulp van de snelle UTF8_BINARY
-collatie.
Voor taalbewuste vergelijkingen maakt Azure Databricks gebruik van de volgende technologieën:
- International Components for Unicode (ICU)-bibliotheek om collatie te berekenen
- Common Locale Data Repository (CLDR) tabellen voor specifieke sortering op basis van taal en regio.
- Unicode Locale Data Markup Language (LDML) om sorteringen intern te coderen.
Deze technologieën worden ingekapseld in een set benoemde sorteringen die kunnen worden gebruikt in SQL-instructies.
Sorteringsnamen
Omdat het identificeren van sorteringen op basis van hun LDML-specificatie complex en lastig kan zijn om te lezen, heeft Azure Databricks een set eenvoudiger te gebruiken benoemde systeemsorteringen.
Syntaxis
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI }
UTF8_BINARY
Een binaire vergelijking van meta-locale waarmee tekenreeksen per byte worden vergeleken op basis van de UTF-8-byteweergave.
UTF8_BINARY
is de standaard- en meest lichtgewicht sortering voor tekenreeksvergelijking in Azure Databricks.In deze sortering 'A' (x'65') < 'B' (x'66') < ... < 'Z' (x'90').
Z (x'90) < 'a' (x'97) en 'A' (x'65') <> 'a' (x'97').
Verder zijn tekens zoals 'Ä' (x'C384') groter dan 'Z' en 'z' in deze sortering.
UTF8_LCASE
Een lichtgewicht meta-locale hoofdletterongevoelige sortering die strings vergelijkt met behulp van hun UTF-8-byteweergave nadat de strings naar kleine letters zijn geconverteerd.
UTF8_LCASE
is de sortering die wordt gebruikt voor id's in Azure Databricks.Bijvoorbeeld:
ORDER BY col COLLATE UTF8_LCASE
is gelijk aan
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
De ICU-root-instelling.
Deze sortering, die bekend staat in CLDR als de landinstelling root (LDML-specificatie: 'und-u') legt een taalagnostische volgorde op, die in het algemeen intuïtief probeert te zijn. In deze sortering worden tekens zoals en gegroepeerd. Bijvoorbeeld: 'a' < 'A' < 'Ä' < 'b'. A wordt niet beschouwd als gelijkwaardig aan 'a'. Daarom is de sortering hoofdlettergevoelig. a wordt niet beschouwd als gelijkwaardig aan 'ä'. Daarom is de sortering accentgevoelig.
lokale instellingen
Een landinstellingsbewuste sortering op basis van de CLDR-tabellen.
De landinstelling wordt opgegeven als een taalcode, een optionele scriptcode en een optionele landcode.
locale
is niet hoofdlettergevoelig.- language_code: een taalcode van twee letters ISO 639-1.
- script_code: een ISO 15924 scriptcode van vier letters.
- country_code: een drieletterige ISO 3166-1 alfa-3 landcode.
modifier
Hiermee geeft u het sorteringsgedrag op met betrekking tot hoofdlettergevoeligheid en accentgevoeligheid.
- CS-: hoofdlettergevoelig. Het standaardgedrag.
- CI-: niet hoofdlettergevoelig.
- AS: Accentgevoelig. Het standaardgedrag.
- AI-: accentongevoelig.
U kunt
CS
ofCI
opgeven, enAS
ofAI
maximaal één keer en in een willekeurige volgorde. De modifiers zelf zijn niet-hoofdlettergevoelig.
Bij het verwerken van een sortering normaliseert Azure Databricks sorteringsnamen door standaardwaarden te verwijderen.
SR_CYR_SRN_CS_AS
wordt bijvoorbeeld genormaliseerd tot SR
.
Zie Ondersteunde sorteringenvoor een lijst met ondersteunde sorteringen.
Voorbeelden
-- 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`
Standaardsortering
De standaardsortering is van toepassing bij het gebruik van STRING
letterlijke waarden, parametermarkeringen, functies zonder STRING
parameters die tekenreeksen produceren en bij het definiëren van kolom-, veld- of variabeletypen zonder een COLLATE-component.
De standaardsortering wordt bepaald in UTF8_BINARY
.
Sorteringsprioriteit
Als u wilt bepalen welke sortering moet worden gebruikt voor een bepaalde tekenreeks, definieert Azure Databricks sorteringsregels.
De regels wijzen vier prioriteitsniveaus toe aan sorteringen:
Expliciete
De sortering is expliciet toegewezen aan een tekenreeks met behulp van de COLLATE expressie.
voorbeelden
-- 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
Impliciete
De sortering wordt impliciet toegewezen door de kolom, veld, kolomalias, variabeleof routineparameter-referentie. Dit omvat het resultaat van een subquery zolang de sortering niet is Geen.
voorbeelden
-- 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', ',')
standaard
Een
STRING
literaal, benoemde of niet-benoemde parameter marker, of eenSTRING
dat wordt geproduceerd door een functie van een ander type.voorbeelden
-- 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()
De toegewezen sortering is de standaardsortering.
Geen
Een
STRING
resultaat van een functie, operator of setoperatie (bijvoorbeeldUNION
) die meer dan éénSTRING
argument gebruikt welke verschillende impliciete sorteringen hebben.Voorbeelden
-- 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
Sorteringsderivatie
Bij het afleiden van de sortering voor een STRING
resultaat, worden de sorteringsprioriteitsregels op de volgende manieren toegepast:
Als de uitdrukking:
komt overeen met de bovenstaande definities
De sortering en prioriteit zijn zoals gedefinieerd.
is een functie of operator met één
STRING
parameter en retourneert eenSTRING
De sortering en prioriteit is die van de parameter
STRING
.is een functie of operator met twee of meer
STRING
parametersmet dezelfde sorteringen en prioriteit
De ordening en prioriteit zijn die van de
STRING
parameters.met verschillende sorteringen of voorrang
Laat
C1
enC2
afzonderlijke sorteringen zijn en laatD
de standaardsortering zijn. De prioriteit en de sortering worden bepaald door de volgende tabel:Rangschikking en rangorde C1 Expliciet C1 Impliciet D-standaard Geen C2 Expliciete Fout C2 Expliciet C2 Expliciet C2 Expliciet C2 impliciete Expliciete C1 Geen C2 Impliciet Geen D standaard C1 Expliciet C1 Impliciet D-standaard Geen Geen C1 Expliciet Geen Geen Geen
Voorbeelden
> 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