編排序列

適用於:勾選為是 Databricks SQL 勾選為是 Databricks Runtime 16.1 和更新版本

定序是一組規則,決定字串比較的執行方式。 合併支援大小寫不區分、重音不區分及不區隔空格的比較,以及語言感知字串排序。

Azure Databricks 中的字串以 UTF-8 編碼為 Unicode 字元。 預設情況下,Azure Databricks 會依據字串的二進位 UTF-8 表示法(稱為 UTF8_BINARY collation)來比較字串。 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

    ICU 根區域,在 CLDR 中稱為root區域(locale,LDML 規範:)。 und-u 此排序採用語言無關的排序,將相似字元歸類。 例如:'a'<'A'<'Ä'<'b'。 此排序預設對大小寫與重音敏感。

  • locale

    基於 CLDR 表格的區域感知排序。 地區設定會指定為語言代碼、選用的腳本程序代碼,以及選擇性的國家/地區代碼。 地點值不區分大小寫。

  • modifier

    控制大小寫敏感度、重音敏感度及後置空格行為。 修飾詞不區分大小寫,且可任意順序指定。

    • CS:大小寫敏感。 默認行為。
    • CI:不區分大小寫。
    • AS:口音敏感。 默認行為。
    • AI:不懂口音。

    適用於:勾選為 yes Databricks SQL 勾選為 yes Databricks Runtime 16.2 及以上版本

    • RTRIM:拖曳空間不敏感。 比較前先修剪後方空格u0020()。

    適用於:勾選為 yes Databricks SQL 勾選為 yes Databricks Runtime 16.2 及以上版本

    你可以指定 RTRIM,最多 CS 一個或 CI,最多 AS 一個或 AI

當 Azure Databricks 處理一個整合名稱時,它會透過移除預設值來正規化該名稱。 例如,正規 SR_CYR_SRN_CS_AS 化為 SR

如需支援的定序列表,請參閱 支援的定序

例子

-- 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_LCASE兩者皆支援基於 UNICODE 的排序,如 和 UNICODE_CIUNICODE_CI_AI 支援大小寫不區分的比較,但在重音字元和地區特定規則的處理方式上有所不同。

行為的差異

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 規則的大小寫不區分比較,特別是當資料包含多語言字元且僅需簡單小寫時。

  • 當格和口音差異都應該忽略時,才會用 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 句的欄位、欄位或變數型別定義。

預設的排序方式如下:

  • 對於 DDL 語句,例如 ALTER TABLECREATE VIEWCREATE TABLECREATE FUNCTION

    • 預設排序規則是建立或更改對象的預設排序規則。
    • 如果未指定任何 DEFAULT COLLATION 子句,則預設的排序規則是 UTF8_BINARY
  • 對於 DML 語句 (UPDATEDELETE FROMINSERTMERGE INTO) 和 Query,預設的排序為 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函數、運算子或集合運算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. 若表達式為一個函數或運算子,且回 STRINGSTRING一個參數,則其排序與優先順序即為該 STRING 參數的排序。

  3. 若表達式為包含兩個或以上 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 functionstartswith functionendswith function