다음을 통해 공유


정렬

적용 대상:확인 표시 있음 Databricks SQL 확인 표시 있음 Databricks Runtime 16.1 이상

데이터 정렬은 문자열 비교가 수행되는 방법을 결정하는 규칙 집합입니다. 데이터 정렬은 대/소문자를 구분하지 않고 악센트를 구분하지 않으며 후행 공간을 구분하지 않는 비교와 언어 인식 문자열 순서 지정을 지원합니다.

Azure Databricks 문자열은 UTF-8 인코딩된 유니코드 문자로 표시됩니다. 기본적으로 Azure Databricks 문자열을 이진 UTF-8 표현(UTF8_BINARY 데이터 정렬이라고 함)으로 비교합니다. UTF8_BINARY 비교는 대부분의 경우 빠르고 적절하지만 언어 인식 정렬 또는 비교가 필요한 애플리케이션에는 적합하지 않을 수 있습니다.

이진 비교 외에도 일반적인 사용 사례는 대/소문자를 구분하지 않는 일치입니다. 데이터 정렬은 UTF8_LCASE 이 용도로 설계되었습니다. 를 사용하여 UTF8_BINARY비교하기 전에 문자열을 소문자로 변환합니다.

언어 인식 비교의 경우 Azure Databricks 다음 기술을 사용합니다.

이러한 기술은 SQL 문에서 사용할 수 있는 명명된 데이터 정렬 집합에 캡슐화됩니다.

비고

Delta Lake 테이블과 함께 데이터 정렬을 사용하는 경우의 제한 사항은 제한 사항을 참조하세요.

대조 이름

Azure Databricks 식별을 간소화하기 위해 명명된 시스템 데이터 정렬을 제공합니다. LDML 사양은 직접 읽고 사용하기에 복잡할 수 있습니다.

통사론

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

locale
  language_code [ _ script_code ] [ _ country_code ]

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

    UTF-8 표현을 기반으로 문자열 바이트 바이트를 비교하는 이진 데이터 정렬입니다. UTF8_BINARY Azure Databricks 가장 간단한 기본 데이터 정렬입니다.

    이 데이터 정렬에서: 'A' (x'65') <'B' (x'66') < ... < 'Z' (x'90'). 그러나 'Z' (x'90')(x'97') <'a''A' (x'65') <>'a' (x'97'). (x'C384')와 같은 'Ä' 문자가 두 'Z' 문자보다 큽니다 'z'.

  • UTF8_LCASE

    문자열을 사용하여 UTF8_BINARY비교하기 전에 소문자로 변환하는 대/소문자를 구분하지 않는 간단한 데이터 정렬입니다.

    UTF8_LCASE Azure Databricks Identifiers 사용되는 데이터 정렬입니다.

    예를 들어:

    ORDER BY col COLLATE UTF8_LCASE
    

    다음과 동일합니다.

    ORDER BY LOWER(col) COLLATE UTF8_BINARY
    
  • UNICODE

    CLDR root 에서 로캘로 알려진 ICU 루트 로캘(LDML 사양: und-u)입니다. 이 데이터 정렬은 유사한 문자를 함께 그룹화하는 언어에 구애받지 않는 순서를 적용합니다. 예: 'a''Ä'<'b''A'<<. 이 데이터 정렬은 기본적으로 대/소문자를 구분하고 악센트를 구분합니다.

  • locale

    CLDR 테이블을 기반으로 하는 로캘 인식 데이터 정렬입니다. 로캘은 언어 코드, 선택적 스크립트 코드 및 선택적 국가 코드로 지정됩니다. 로캘 값은 대/소문자를 구분하지 않습니다.

    • language_code: 두 글자 ISO 639-1 언어 코드입니다.
    • script_code: 4자로 된 ISO 15924 스크립트 코드입니다.
    • country_code: 세 글자 ISO 3166-1 알파-3 국가 코드입니다.
  • modifier

    대/소문자 구분, 악센트 구분 및 후행 공간 동작을 제어합니다. 한정자는 대/소문자를 구분하지 않으며 어떤 순서로든 지정할 수 있습니다.

    • CS: 대/소문자를 구분합니다. 기본 동작입니다.
    • CI: 대/소문자를 구분하지 않습니다.
    • AS: 악센트를 구분합니다. 기본 동작입니다.
    • AI: 악센트를 구분하지 않습니다.

    적용 대상:확인 표시 있음 Databricks SQL 확인 표시 있음 Databricks Runtime 16.2 이상

    • RTRIM: 후행 공백을 구분하지 않습니다. 비교 전에 후행 공백(u0020)을 트리밍합니다.

    적용 대상:확인 표시 있음 Databricks SQL 확인 표시 있음 Databricks Runtime 16.2 이상

    최대 하나 또는 , 최대 하나 CS 또는 CIAI.를 AS 지정할 RTRIM수 있습니다.

Azure Databricks 데이터 정렬 이름을 처리할 때 기본값을 제거하여 이름을 정규화합니다. 예를 들어 . SR_CYR_SRN_CS_ASSR

지원되는 데이터 정렬 목록은 지원되는 데이터 정렬을 참조하세요.

예제

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

비교 UTF8_LCASE 및 유니코드 데이터 정렬

대/소문자를 구분하지 않는 비교와 같은 UNICODE_CI 유니코드 기반 데이터 정렬은 UNICODE_CI_AI 모두 UTF8_LCASE 지원하지만 악센트가 있는 문자와 로캘별 규칙을 처리하는 방식이 다릅니다.

동작의 차이

UTF8_LCASE 를 사용하여 UTF8_BINARY문자열을 소문자로 변환하고 바이트 바이트를 비교합니다. 가볍고 빠르지만 악센트가 있는 문자는 중심이 없는 형태와 구별됩니다.

UNICODE 기반 데이터 정렬은 ICU 라이브러리 및 CLDR 로캘 데이터를 사용합니다. CIAI 한정자는 대/소문자, 악센트 또는 둘 다 다른 경우에도 동일한 문자로 처리하도록 확장합니다. 이러한 데이터 정렬은 더 철저하지만 계산 비용이 더 높습니다.

작동 방식 UTF8_LCASE UNICODE_CI UNICODE_CI_AI
'A' = 'a' true true true
'Café' = 'café' true true true
'Cafe' = 'Café' false false true
'ß' = 'ss' (독일어 날카로운 s) false false false
'resume' = 'résumé' false false true
LIKERLIKE 지원 No No
로캘별 규칙 지원 No

각 데이터 정렬을 사용하는 경우

  • 강조 문자가 고유하게 유지되어야 하는 경우 대/소문자를 구분하지 않는 빠른 비교에 사용합니다 UTF8_LCASE . 이 데이터 정렬은 대/소문자를 구분하지 않는 간단한 문자열 일치를 사용하는 시스템에서 데이터 웨어하우스 마이그레이션에 적합합니다.

  • 유니코드 규칙을 따르는 대/소문자를 구분하지 않는 비교에 사용합니다. 특히 데이터에 간단한 소문자가 부족한 여러 언어의 문자가 포함된 경우에 사용합니다 UNICODE_CI .

  • 대/소문자와 악센트 차이를 모두 무시해야 하는 경우에 사용합니다 UNICODE_CI_AI . 예를 들어 검색 "resume" 이 일치 "résumé"해야 하는 경우입니다. 이는 사용자 연결 검색 및 다국어 애플리케이션에서 일반적입니다.

예제

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

기본 정렬 방식

기본 데이터 정렬은 리터럴, 매개 변수 표식, 문자열을 생성하는 매개 변수가 없는 STRING 함수, 절이 없는 COLLATE 열, 필드 또는 변수 형식 정의에 적용됩니다STRING.

기본 데이터 정렬은 다음과 같이 파생됩니다.

  • DDL 문(예: ALTER TABLE, CREATE VIEW, CREATE TABLECREATE FUNCTION: )의 경우

    • 기본 데이터 정렬은 만들거나 변경하는 개체의 기본 데이터 정렬입니다.
    • DEFAULT COLLATION 절을 지정하지 않으면 기본 정렬은 UTF8_BINARY입니다.
  • DML 문(UPDATE, , DELETE FROM,INSERTMERGE INTO) 및 쿼리의 경우 기본 데이터 정렬은 UTF8_BINARY.

데이터 정렬 우선 순위

Azure Databricks 데이터 정렬 우선 순위 규칙을 적용하여 지정된 문자열에 사용할 데이터 정렬을 결정합니다. 네 가지 우선 순위 수준이 정의됩니다.

  1. 명시적

    데이터 정렬은 식을 사용하여 collate명시적으로 할당됩니다.

    -- 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. 함축적인

    데이터 정렬은 데이터 정렬이 None이 아닌 하위 쿼리의 결과를 포함하여 열 이름, 필드 이름, 열 별칭, 변수 이름 또는 매개 변수 이름 참조에 의해 암시적으로 할당됩니다.

    -- 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. 기본값

    STRING 리터럴, 명명되거나 명명되지 않은 매개 변수 표식 또는 STRING 다른 형식의 함수에 의해 생성된 표식입니다.

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

    할당된 데이터 정렬은 기본 데이터 정렬입니다.

  4. 없음

    STRING 서로 다른 암시적 데이터 정렬을 사용하여 둘 STRING 이상의 인수를 사용하는 함수UNION, 연산자 또는 설정 작업의 결과입니다.

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

정렬 도출

결과에 대한 데이터 정렬을 STRING 파생할 때 우선 순위 규칙은 다음과 같이 적용됩니다.

  1. 식이 위의 정의 중 하나와 일치하면 데이터 정렬 및 우선 순위가 정의됩니다.

  2. 식이 단일 STRING 매개 변수를 반환하는 STRING함수 또는 연산자인 경우 데이터 정렬 및 우선 순위는 매개 변수의 STRING 데이터 정렬과 우선 순위입니다.

  3. 식이 두 개 이상의 STRING 매개 변수가 있는 함수 또는 연산자인 경우:

    1. 모든 매개 변수의 데이터 정렬과 우선 순위가 같으면 결과는 해당 데이터 정렬과 우선 순위를 사용합니다.

    2. 매개 변수에 데이터 정렬 또는 우선 순위가 다른 경우 고유 데이터 정렬 D 을 사용하고 C1C2 기본 데이터 정렬이 됩니다. 결과는 다음 표에 의해 결정됩니다.

정렬 순서 및 우선순위 C1 명시적 C1 암시적 D 기본값 없음
C2 명시적 오류 C2 명시적 C2 명시적 C2 명시적
C2 암시적 명시적 C1 없음 C2 암시적 없음
D 기본값 C1 명시적 C1 암시적 D 기본값 없음
없음 C1 명시적 없음 없음 없음

예제

> 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

제한점

많은 패턴 일치 및 정규식 함수는 데이터 정렬만 UTF8_BINARY 지원 UTF8_LCASE 합니다. Azure Databricks 이러한 함수가 UNICODE 같은 다른 데이터 정렬이나 DE 또는 FR_CI_AI 같은 로캘별 데이터 정렬과 함께 사용될 때 오류가 발생합니다.

영향을 받는 함수에는 , LIKEILIKE및 함수 패밀리가 RLIKE 포함regexp_*됩니다. 열에서 다른 데이터 정렬과 일치하는 문자열의 경우 함수, contains 함수 또는 startswith 함수를 사용합니다endswith.