Delen via


Collatie

Belangrijk

Deze functie bevindt zich in openbare preview-versie.

Van toepassing op:met ja gemarkeerd 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:

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.

  • 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 of CIopgeven, en AS of AI 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:

  1. 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
    
  2. 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', ',')
    
  3. standaard

    Een STRING literaal, benoemde of niet-benoemde parameter marker, of een STRING 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.

  4. Geen

    Een STRING resultaat van een functie, operator of setoperatie (bijvoorbeeld UNION) die meer dan één STRING 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:

  1. komt overeen met de bovenstaande definities

    De sortering en prioriteit zijn zoals gedefinieerd.

  2. is een functie of operator met één STRING parameter en retourneert een STRING

    De sortering en prioriteit is die van de parameter STRING.

  3. is een functie of operator met twee of meer STRING parameters

    1. met dezelfde sorteringen en prioriteit

      De ordening en prioriteit zijn die van de STRING parameters.

    2. met verschillende sorteringen of voorrang

      Laat C1 en C2 afzonderlijke sorteringen zijn en laat D 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