Egybevetés

A következőre vonatkozik:be van jelölve Databricks SQL be van jelölve Databricks Runtime 16.1 és újabb

A rendezés olyan szabályok halmaza, amelyek meghatározzák a karakterlánc-összehasonlítások végrehajtását. A rendezések támogatják a kis- és nagybetűk megkülönböztetését, az ékezetes érzéketleneket és a záró szóközök érzéketlen összehasonlítását, valamint a nyelvérzékeny sztringek sorrendjét.

A Azure Databricks sztringjei UTF-8 kódolt Kódkarakterek. Alapértelmezés szerint a Azure Databricks a sztringeket a bináris UTF-8-ábrázolásukkal hasonlítja össze, más néven UTF8_BINARY rendezéssel. UTF8_BINARY az összehasonlítások sok esetben gyorsak és megfelelőek, de nem feltétlenül alkalmasak olyan alkalmazásokhoz, amelyek nyelvtudatos rendezést vagy összehasonlítást igényelnek.

A bináris összehasonlításokon túl gyakori használati eset a kis- és nagybetűk megkülönböztetése. A UTF8_LCASE rendezés erre a célra készült. A sztringeket kisbetűssé alakítja, mielőtt összehasonlítja őket.UTF8_BINARY

Nyelvtudatos összehasonlítások esetén Azure Databricks a következő technológiákat használja:

Ezek a technológiák az SQL-utasításokban használható nevesített rendezések halmazában vannak beágyazva.

Megjegyzés:

A Delta Lake-táblákkal végzett rendezésekkel kapcsolatos korlátozásokért lásd a Korlátozások című témakört.

Rendezési nevek

Azure Databricks elnevezett rendszerelrendezéseket biztosít az azonosítás egyszerűsítése érdekében. Az LDML-specifikációk bonyolultak lehetnek közvetlenül olvashatók és használhatók.

Szintaxis

{ UTF8_BINARY |
  UTF8_LCASE |
  { UNICODE | locale } [ _ modifier [...] ] }

locale
  language_code [ _ script_code ] [ _ country_code ]

modifier
  { CS | CI | AS | AI | RTRIM }
  • UTF8_BINARY

    Bináris rendezés, amely az UTF-8-ábrázolásuk alapján hasonlítja össze a sztringek bájtonkénti értékét. UTF8_BINARY a Azure Databricks alapértelmezett és legkönnyűbb rendezése.

    Ebben a rendezésben: 'A' (x'65') <'B' (x'66') < ... < 'Z' (x'90'). Azonban 'Z' (x'90')<'a'(x'97'), és 'A' (x'65') <>'a' (x'97'). Az olyan karakterek, mint az 'Ä' (x'C384') nagyobbak, mint mindkettő 'Z' és 'z'.

  • UTF8_LCASE

    Egy kis- és nagybetűket nem érzékelyítő rendezés, amely a sztringeket kisbetűssé alakítja, mielőtt összehasonlítja őket.UTF8_BINARY

    UTF8_LCASE a Azure Databricks Identifiers esetén használt rendezés.

    Például:

    ORDER BY col COLLATE UTF8_LCASE
    

    egyenértékű a következővel:

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    Az ICU gyökér területi beállítása, amely a CLDR-ben területi beállításként root ismert (LDML-specifikáció: und-u). Ez a rendezés olyan nyelvi-agnosztikus sorrendet alkalmaz, amely a hasonló karaktereket csoportosítja. Például: 'a'<'A'<'Ä'<'b'. Ez a rendezés alapértelmezés szerint megkülönbözteti a kis- és nagybetűk megkülönböztetettségét.

  • locale

    Területi beállításokkal rendelkező rendezés CLDR-táblák alapján. A területi beállítás nyelvi kódként, opcionális szkriptkódként és opcionális országkódként van megadva. A területi értékek nem érzékenyek a kis- és nagybetűkre.

  • modifier

    Szabályozza a kis- és nagybetűk érzékenységét, az ékezetes érzékenységet és a záró tér viselkedését. A módosítók nem érzékenyek a kis- és nagybetűkre, és bármilyen sorrendben megadhatók.

    • CS: Kis- és nagybetűk megkülönböztetése. Az alapértelmezett viselkedés.
    • CI: Kis- és nagybetűk érzéketlenek.
    • AS: Jelölőszín-érzékeny. Az alapértelmezett viselkedés.
    • AI: Ékezetes érzéketlen.

    A következőre vonatkozik:pipával jelölve: igen Databricks SQL pipával jelölve: igen Databricks Runtime 16.2 és újabb

    • RTRIM: Záró-tér érzéketlen. Az összehasonlítás előtt levágja a záró szóközöket (u0020).

    A következőre vonatkozik:pipával jelölve: igen Databricks SQL pipával jelölve: igen Databricks Runtime 16.2 és újabb

    Legfeljebb az egyiketRTRIMCS, vagy legfeljebb az egyiket CIAS megadhatjaAI.

Ha Azure Databricks feldolgoz egy rendezési nevet, az alapértelmezések eltávolításával normalizálja a nevet. Például SR_CYR_SRN_CS_AS normalizálja a következőt SR: .

A támogatott rendezések listáját a Támogatott rendezések című témakörben találja.

Példák

-- 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`

Összehasonlítása UTF8_LCASE és UNICODE-rendezések

Mind UTF8_LCASE a UNICODE-alapú rendezések, például UNICODE_CI a kis- és UNICODE_CI_AI nagybetűk érzéketlen összehasonlítását támogatják, de eltérőek az ékezetes karakterek és a területi szabályok kezelésének módjában.

Viselkedésbeli különbségek

UTF8_LCASE a sztringeket kisbetűssé alakítja, és összehasonlítja őket bájtonként a használatával UTF8_BINARY. Könnyű és gyors, de az ékezetes karaktereket a nem szagolatlan formáktól eltérően kezeli.

A UNICODE-alapú rendezések az ICU-kódtárat és a CLDR területi adatokat használják. A CI módosítók kiterjesztik AI ezt a lehetőséget, hogy a karaktereket egyenértékűként kezeljék akkor is, ha eltérnek a kis- és nagybetűktől, az ékezetestől vagy mindkettőtől. Ezek a rendezések alaposabbak, de nagyobb számítási költséggel rendelkeznek.

Magatartás UTF8_LCASE UNICODE_CI UNICODE_CI_AI
'A' = 'a' true true true
'Café' = 'café' true true true
'Cafe' = 'Café' false false true
'ß' = 'ss' (német éles) false false false
'resume' = 'résumé' false false true
Támogatja LIKE és RLIKE Igen No No
Támogatja a területi beállításokra vonatkozó szabályokat No Igen Igen

Mikor érdemes használni az egyes rendezéseket?

  • Gyors kis- és nagybetűk érzéketlen összehasonlítására használható UTF8_LCASE , ha a jelölő karaktereknek eltérőnek kell lenniük. Ez a rendezés kiválóan alkalmas az adattárházak egyszerű kis- és nagybetűk közötti sztringegyeztetést használó rendszerekből történő migrálására.

  • Unicode-szabályokat követő kis- és nagybetűs összehasonlításokhoz használható UNICODE_CI , különösen akkor, ha az adatok több nyelvből származó karaktereket tartalmaznak, ahol az egyszerű alsóbbrendűség nem elegendő.

  • Akkor használható UNICODE_CI_AI , ha a kis- és a nagybetűk közötti különbségeket figyelmen kívül kell hagyni. Ha például egy keresésnek "resume" egyeznie "résumé"kell. Ez gyakori a felhasználó által használt keresésekben és többnyelvű alkalmazásokban.

Példák

-- 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

Alapértelmezett koláció

Az alapértelmezett rendezés a konstansokra, paraméterjelölőkre STRING , sztringeket előállító paraméterek nélküli STRING függvényekre, valamint oszlop-, mező- vagy változótípus-definíciókra vonatkozik záradék nélkül COLLATE .

Az alapértelmezett rendezés a következőképpen lesz származtatva:

  • Az olyan DDL-utasítások esetében, mint a ALTER TABLE, CREATE VIEW, CREATE TABLEés CREATE FUNCTION:

    • Az alapértelmezett rendezés a létrehozott vagy módosított objektum alapértelmezett rendezése.
    • Ha nincs megadva DEFAULT COLLATION záradék, az alapértelmezett rendezés UTF8_BINARY.
  • A DML-utasítások (UPDATE, , DELETE FROM, INSERTMERGE INTO) és lekérdezések esetében az alapértelmezett rendezés az UTF8_BINARY.

Rendezés elsőbbsége

Azure Databricks rendezési elsőbbséget biztosító szabályokat alkalmaz annak meghatározására, hogy egy adott sztringhez melyik rendezést kell használni. Négy elsőbbségi szint van meghatározva:

  1. Kifejezett

    A rendezés explicit módon van hozzárendelve kifejezésselcollate.

    -- 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 DE
    
  2. Implicit

    A rendezést implicit módon oszlopnév, mezőnév, oszlop aliasa, változónév vagy paraméternév-hivatkozás rendeli hozzá, beleértve egy olyan alquery eredményét is, amelyben a rendezés nem Nincs.

    -- Use the collation of the column as defined.
    employee.name LIKE 'Mc%'
    
    -- Use the collation of the variable as defined.
    translate(session.tempvar, 'Z', ',')
    
  3. Alapértelmezett

    Egy STRING konstans, névvel ellátott vagy meg nem nevezett paraméterjelölő, vagy egy STRING másik típusból származó függvény által előállított.

    -- 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()
    

    A hozzárendelt rendezés az alapértelmezett rendezés.

  4. Egyik sem

    Egy STRING függvény, operátor vagy halmazművelet eredménye, amely UNION egynél STRING több argumentumot vesz igénybe különböző implicit rendezésekkel.

    -- 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
    

Rendezés származtatása

Az eredmény rendezésekor STRING az alábbi sorrendi szabályok érvényesek:

  1. Ha a kifejezés megfelel a fenti definíciók egyikének, a rendezés és az elsőbbség a megadott módon történik.

  2. Ha a kifejezés egy függvény vagy operátor, amelynek egyetlen STRING paramétere ad vissza egy STRINGértéket, akkor a rendezés és az elsőbbség a STRING paraméteré.

  3. Ha a kifejezés egy függvény vagy operátor két vagy több STRING paraméterrel:

    1. Ha minden paraméter ugyanazzal a rendezéssel és előzményekkel rendelkezik, az eredmény ezt a rendezést és elsőbbséget használja.

    2. Ha a paraméterek eltérő rendezésekkel vagy előzményekkel rendelkeznek, legyen C1C2 és legyen különböző rendezés, és D legyen az alapértelmezett rendezés. Az eredményt a következő táblázat határozza meg:

Összehasonlítás és elsőbbség C1 Kifejezett C1 Implikált D alapértelmezett Egyik sem
C2 Kifejezett Hiba C2 Kifejezett C2 Kifejezett C2 Kifejezett
C2 Implicit Explicit C1 Egyik sem C2 Implicit Egyik sem
D alapértelmezett C1 Kifejezett C1 Implikált D alapértelmezett Egyik sem
Egyik sem C1 Kifejezett Egyik sem Egyik sem Egyik sem

Példák

> 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

Korlátozások

Számos mintaegyeztető és regex függvény támogatja a csak UTF8_BINARY és UTF8_LCASE a rendezéseket. Azure Databricks hibát jelez, ha ezeket a függvényeket más rendezésekkel használják, például UNICODE vagy területi beállításokra vonatkozó rendezésekkel, például DE vagy FR_CI_AI.

Az érintett függvények közé tartozik LIKEa , ILIKE, RLIKEés a regexp_* függvénycsalád. Ha az oszlopokon más rendezésekkel egyező sztringeket használ, használja contains a függvényt, startswith a függvényt vagy endswith a függvényt.