Harmanlama

Şunlar için geçerlidir:evet olarak işaretlendi Databricks SQL evet olarak işaretlendi Databricks Runtime 16.1 ve üzeri

Harmanlama, dize karşılaştırmalarının nasıl gerçekleştirileceğini belirleyen bir dizi kuraldır. Harmanlamalar büyük/küçük harfe duyarlı olmayan, aksan duyarsız ve sondaki alana duyarlı olmayan karşılaştırmaların yanı sıra dil kullanan dize sıralamasını destekler.

Azure Databricks dizeleri UTF-8 kodlanmış Unicode karakterleri olarak temsil edilir. Varsayılan olarak, Azure Databricks dizeleri UTF8_BINARY harmanlaması olarak bilinen ikili UTF-8 gösterimleriyle karşılaştırır. UTF8_BINARY karşılaştırmalar çoğu durumda hızlı ve uygundur, ancak dil kullanan sıralama veya karşılaştırma gerektiren uygulamalar için uygun olmayabilir.

İkili karşılaştırmaların ötesinde yaygın bir kullanım örneği büyük/küçük harfe duyarsız eşleştirmedir. Harmanlama UTF8_LCASE bu amaç için tasarlanmıştır. kullanarak UTF8_BINARYkarşılaştırmadan önce dizeleri küçük harfe dönüştürür.

Dil kullanan karşılaştırmalar için Azure Databricks aşağıdaki teknolojileri kullanır:

Bu teknolojiler, SQL deyimlerinde kullanılabilen bir dizi adlandırılmış harmanlama içinde kapsüllenir.

Uyarı

Delta Lake tablolarıyla harmanlamalar kullanırken sınırlamalar için bkz. Sınırlamalar.

Sıralama adları

Azure Databricks tanımlamayı basitleştirmek için adlandırılmış sistem harmanlamaları sağlar. LDML belirtimlerinin doğrudan okunup kullanılması karmaşık olabilir.

Sözdizimi

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

locale
  language_code [ _ script_code ] [ _ country_code ]

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

    DIZEleri UTF-8 gösterimine göre bayt bayt karşılaştıran ikili harmanlama. UTF8_BINARY, Azure Databricks varsayılan ve en basit harmanlamadır.

    Bu harmanlamada: 'A' (x'65') <'B' (x'66') < ... < 'Z' (x'90'). Ancak, 'Z' (x'90') <'a' (x'97') ve 'A' (x'65') <>'a' (x'97'). (x'C384') gibi 'Ä' karakterler hem hem 'Z'de 'z' değerinden büyüktür.

  • UTF8_LCASE

    kullanarak UTF8_BINARYkarşılaştırmadan önce dizeleri küçük harfe dönüştüren basit, büyük/küçük harfe duyarlı olmayan harmanlama.

    UTF8_LCASE Identifiers Azure Databricks için kullanılan harmanlamadır.

    Örneğin:

    ORDER BY col COLLATE UTF8_LCASE
    

    eşdeğerdir:

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    CLDR'de yerel ayar olarak root bilinen ICU kök yerel ayarı (LDML belirtimi: und-u). Bu harmanlama, benzer karakterleri birlikte gruplandıran dilden bağımsız bir sıra uygular. Örneğin: 'a'<'A'<'Ä'<'b'. Bu harmanlama, varsayılan olarak büyük/küçük harfe ve vurguya duyarlıdır.

  • locale

    CLDR tablolarını temel alan yerel ayar kullanan harmanlama. Yerel ayar bir dil kodu, isteğe bağlı bir betik kodu ve isteğe bağlı bir ülke kodu olarak belirtilir. Yerel ayar değerleri büyük/küçük harfe duyarlı değildir.

  • modifier

    Büyük/küçük harf duyarlılığını, vurgu duyarlılığını ve sondaki alan davranışını denetler. Değiştiriciler büyük/küçük harfe duyarlı değildir ve herhangi bir sırada belirtilebilir.

    • CS:Duyarlı. Varsayılan davranış.
    • CI:Duyarlı.
    • AS: Vurguya duyarlı. Varsayılan davranış.
    • AI: Vurguya duyarsız.

    Şunun için geçerlidir:evet olarak işaretli Databricks SQL evet olarak işaretli Databricks Runtime 16.2 ve üzeri

    • RTRIM: Sondaki boşluk duyarsız. Karşılaştırmadan önce sondaki boşlukları (u0020) kırpılır.

    Şunun için geçerlidir:evet olarak işaretli Databricks SQL evet olarak işaretli Databricks Runtime 16.2 ve üzeri

    , en çok veya RTRIMveya CS ve en fazla bir CI veya ASbelirtebilirsinizAI.

Azure Databricks harmanlama adını işlediğinde, varsayılan değerleri kaldırarak adı normalleştirir. Örneğin, SR_CYR_SRN_CS_AS olarak normalleştirir SR.

Desteklenen harmanlamaların listesi için bkz. desteklenen harmanlamalar.

Örnekler

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

Karşılaştırma UTF8_LCASE ve UNICODE harmanlamaları

ve gibi UTF8_LCASEUNICODE_CI hem hem de UNICODE_CI_AI UNICODE tabanlı harmanlamalar büyük/küçük harfe duyarsız karşılaştırmaları destekler, ancak aksanlı karakterleri ve yerel ayara özgü kuralları işleme yöntemlerinde farklılık gösterir.

Davranış farklılıkları

UTF8_LCASE dizeleri küçük harfe dönüştürür ve kullanarak UTF8_BINARYbayt bayt karşılaştırır. Basit ve hızlıdır, ancak aksanlı karakterlere, fark edilmeyen biçimlerinden farklı davranır.

UNICODE tabanlı harmanlamalar ICU kitaplığını ve CLDR yerel ayar verilerini kullanır. CI ve AI değiştiricileri, büyük/küçük harf, vurgu veya her ikisinde farklı olsalar bile karakterleri eşdeğer olarak ele almak için bunu genişletir. Bu harmanlamalar daha kapsamlıdır ancak hesaplama maliyeti daha yüksektir.

Davranış UTF8_LCASE UNICODE_CI UNICODE_CI_AI
'A' = 'a' true true true
'Café' = 'café' true true true
'Cafe' = 'Café' false false true
'ß' = 'ss' (Almanca keskin s) false false false
'resume' = 'résumé' false false true
LIKE ve RLIKE destekler Evet Hayır Hayır
Yerel ayara özgü kuralları destekler Hayır Evet Evet

Her harmanlama ne zaman kullanılır?

  • Aksanlı karakterlerin farklı kalması gerektiğinde hızlı büyük/küçük harfe duyarlı olmayan karşılaştırmalar için kullanın UTF8_LCASE . Bu harmanlama, basit büyük/küçük harfe duyarlı olmayan dize eşleştirme kullanan sistemlerden veri ambarı geçişleri için uygundur.

  • Özellikle veriler basit küçük harflerin yetersiz olduğu birden çok dilden karakterler içerdiğinde Unicode kurallarına uyan büyük/küçük harfe duyarlı olmayan karşılaştırmalar için kullanın UNICODE_CI .

  • Hem büyük/küçük harf hem de vurgu farklılıkları yoksayıldığında kullanın UNICODE_CI_AI . Örneğin, araması "resume" ile eşleşmesi "résumé"gerekiyorsa. Bu, kullanıcıya yönelik arama ve çok dilli uygulamalarda yaygındır.

Örnekler

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

Varsayılan harmanlama

Varsayılan harmanlama değişmez değerler, parametre işaretçileri, dize üreten parametreler içermeyen işlevler ve yan STRING tümcesi olmayan STRING sütun, alan veya değişken türü tanımları için geçerlidirCOLLATE.

Varsayılan harmanlama aşağıdaki gibi türetilir:

  • ALTER TABLE, CREATE VIEW, CREATE TABLE ve CREATE FUNCTION gibi DDL deyimleri için:

    • Varsayılan harmanlama, oluşturulan veya değiştirilen nesnenin varsayılan harmanlamasıdır.
    • DEFAULT COLLATION yan tümcesi belirtilmezse, varsayılan harmanlama UTF8_BINARYolarak kabul edilir.
  • DML deyimleri (UPDATE, DELETE FROM, INSERT, MERGE INTO) ve Query için varsayılan harmanlama olur UTF8_BINARY.

Harmanlama önceliği

Azure Databricks, belirli bir dize için hangi harmanlamanın kullanılacağını belirlemek için harmanlama önceliği kurallarını uygular. Dört öncelik düzeyi tanımlanır:

  1. Belirgin

    Harmanlama açıkça ifade kullanılarak collateatanır.

    -- 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. Örtük

    Harmanlama örtük olarak sütun adı, Alan adı, Sütun diğer adı, Değişken adı veya Parametre adı başvurusu tarafından atanır; harmanlamanın Hiçbiri olmadığı bir alt sorgunun sonucu da buna dahildir.

    -- 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. Varsayılan

    Değişmez STRING değer, adlandırılmış veya adlandırılmamış Parametre işaretçileri veya başka bir STRING türden bir işlev tarafından üretilen.

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

    Atanan harmanlama varsayılan harmanlamadır.

  4. Yok

    STRING Farklı örtük harmanlamalara sahip birden UNION fazla bağımsız değişken alan gibi STRING bir işlev, işleç veya ayarlama işleminin sonucu.

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

Sıralama türetme

Bir STRING sonuç için harmanlama türetilirken öncelik kuralları aşağıdaki gibi uygulanır:

  1. İfade yukarıdaki tanımlardan biriyle eşleşiyorsa, harmanlama ve öncelik tanımlandığı gibi olur.

  2. İfade, tek STRING bir parametre döndüren bir STRINGişlev veya işleçse, harmanlama ve öncelik, parametresinin STRING değerleridir.

  3. İfade iki veya daha fazla STRING parametreye sahip bir işlev veya işleçse:

    1. Tüm parametreler aynı harmanlama ve önceliğe sahipse, sonuç bu harmanlamayı ve önceliği kullanır.

    2. Parametreler farklı harmanlamalara veya önceliğe sahipse, C1C2 ayrı harmanlamalar D ve varsayılan harmanlama olsun. Sonuç aşağıdaki tablo tarafından belirlenir:

Harmanlama ve Öncelik C1 Belirgin C1 Gizli D Varsayılan Hiç kimse
C2 Belirgin Hata C2 Belirgin C2 Belirgin C2 Belirgin
C2 Örtük Açık C1 Hiç kimse C2 Örtük Hiç kimse
D Varsayılan C1 Belirgin C1 Gizli D Varsayılan Hiç kimse
Hiç kimse C1 Belirgin Hiç kimse Hiç kimse Hiç kimse

Örnekler

> 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

Sınırlamalar

Birçok desen eşleştirme ve regex işlevi yalnızca UTF8_BINARY ve UTF8_LCASE harmanlamaları destekler. Azure Databricks, bu işlevler UNICODE gibi diğer harmanlamalarla veya DE veya FR_CI_AI gibi yerel ayara özgü harmanlamalarla kullanıldığında bir hata oluşturur.

Etkilenen işlevler , , LIKEILIKEve RLIKE işlev ailesini içerirregexp_*. Diğer harmanlamalarla sütunlarda dize eşleştirme için işlev, contains işlev veya startswith işlev kullanınendswith.