照合順序

適用対象:チェックマーク付き: はい Databricks SQL チェックマーク付き: はい Databricks Runtime 16.1 以降

照合順序は、文字列比較の実行方法を決定する一連の規則です。 照合順序では、大文字と小文字が区別されず、アクセントが区別されず、末尾にスペースを区別しない比較と、言語対応の文字列の順序がサポートされます。

Azure Databricks内の文字列は、UTF-8 エンコードされた Unicode 文字として表されます。 既定では、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') <'a' (x'97')、 '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

    ロケール (LDML 仕様: ) として CLDR で知られる ICU ルート ロケール。 この照合順序では、類似した文字をグループ化する言語に依存しない順序が適用されます。 例: 'a'<'A'<'Ä'<'b'。 この照合順序では、既定では大文字と小文字が区別され、アクセントが区別されます。

  • locale

    CLDR テーブルに基づくロケール対応の照合順序。 ロケールは、言語コード、オプションのスクリプト コード、およびオプションの国コードとして指定されます。 ロケール値では大文字と小文字が区別されません。

    • language_code: 2 文字の ISO 639-1 言語コード。
    • script_code: 4 文字の ISO 15924 スクリプト コード。
    • country_code: 3 文字の ISO 3166-1 alpha-3 国コード。
  • modifier

    大文字と小文字の区別、アクセントの区別、および末尾のスペースの動作を制御します。 修飾子では大文字と小文字が区別されず、任意の順序で指定できます。

    • CS:大文字 小文字。 既定の動作。
    • CI:大文字 小文字。
    • AS: アクセントを区別します。 既定の動作。
    • AI: アクセントを区別しません。

    適用対象:チェック マークあり Databricks SQL Databricks Runtime 16.2 以降

    • RTRIM: 末尾のスペースが区別されません。 比較前に末尾のスペース (u0020) をトリミングします。

    適用対象:チェック マークあり Databricks SQL Databricks Runtime 16.2 以降

    RTRIM、最大 1 つのCSまたはCI、および最大 1 つのASまたはAIを指定できます。

照合順序名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 照合順序を比較する

UTF8_LCASEUNICODE_CIなどのUNICODE_CI_AIおよび UNICODE ベースの照合順序では、大文字と小文字を区別しない比較がサポートされますが、アクセント付き文字とロケール固有の規則の処理方法は異なります。

動作の違い

UTF8_LCASE は文字列を小文字に変換し、 UTF8_BINARYを使用してバイト単位で比較します。 軽量で高速ですが、アクセント付き文字は、その上昇していない形式とは異なるものとして扱われます。

UNICODE ベースの照合順序では、ICU ライブラリと CLDR ロケール データが使用されます。 CIおよびAI修飾子は、大文字と小文字、アクセント、またはその両方が異なる場合でも文字を同等として扱うためにこれを拡張します。 これらの照合順序は、より徹底していますが、計算コストが高くなります。

行動 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をサポートします はい いいえ いいえ
ロケール固有のルールをサポートします いいえ はい はい

各照合順序を使用する場合

  • UTF8_LCASEを使用すると、アクセント付き文字を区別する必要がある場合に、大文字と小文字を区別しない高速比較を行います。 この照合順序は、大文字と小文字を区別しない単純な文字列照合を使用するシステムからのデータ ウェアハウスの移行に適しています。

  • UNICODE_CIは、Unicode ルールに従う大文字と小文字を区別しない比較に使用します。特に、単純な小文字が不十分な複数の言語の文字がデータに含まれている場合に使用します。

  • 大文字と小文字の違いとアクセントの両方を無視する必要がある場合は、 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パラメーターのないSTRINGリテラル、パラメーター マーカー、関数、およびCOLLATE句のない列、フィールド、または変数の型定義に適用されます。

既定の照合順序は次のように派生します。

  • ALTER TABLECREATE VIEWCREATE TABLECREATE FUNCTIONなどの DDL ステートメントの場合:

    • 既定の照合順序は、作成または変更されるオブジェクトの既定の照合順序です。
    • DEFAULT COLLATION 句が指定されていない場合、既定の照合順序は UTF8_BINARYです。
  • DML ステートメント (UPDATEDELETE FROMINSERTMERGE INTO) と Query の場合、既定の照合順序は UTF8_BINARY

照合順序の優先順位

Azure Databricksでは、照合順序の優先順位規則を適用して、特定の文字列に使用する照合順序を決定します。 次の 4 つの優先順位レベルが定義されています。

  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引数を受け取るUNIONなどの関数、演算子、または設定操作の結果STRING

    -- 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. 式が 2 つ以上の STRING パラメーターを持つ関数または演算子の場合:

    1. すべてのパラメーターの照合順序と優先順位が同じ場合、結果はその照合順序と優先順位を使用します。

    2. パラメーターの照合順序または優先順位が異なる場合は、 C1C2 を個別の照合順序にし、既定の照合順序 D します。 結果は、次の表によって決まります。

照合順序と優先順位 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 などの他の照合順序や、DEFR_CI_AI などのロケール固有の照合順序でこれらの関数を使用すると、エラーが発生します。

影響を受ける関数には、 LIKEILIKERLIKE、および regexp_* 関数ファミリが含まれます。 他の照合順序を持つ列の文字列照合には、 contains 関数startswith 関数、または endswith 関数を使用します。