適用於:
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 使用以下技術:
- International Components for Unicode(ICU) 函式庫 用於計算排序。
- 用於區域感知整合的共用區域資料庫(CLDR)資料表。
- Unicode 地區設定資料標記語言(LDML) 來內部編碼排序。
這些技術封裝在一組命名的彙整中,供 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_BINARYUNICODEICU 根區域,在 CLDR 中稱為
root區域(locale,LDML 規範:)。und-u此排序採用語言無關的排序,將相似字元歸類。 例如:'a'<'A'<'Ä'<'b'。 此排序預設對大小寫與重音敏感。locale基於 CLDR 表格的區域感知排序。 地區設定會指定為語言代碼、選用的腳本程序代碼,以及選擇性的國家/地區代碼。 地點值不區分大小寫。
-
language_code:一個兩字母 的 ISO 639-1 語言代碼。 -
script_code:一個四字母 的ISO 15924 手寫代碼。 -
country_code:一個三字母 的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,最多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 地點資料。
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 |
支援LIKE和RLIKE |
是的 | 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 TABLE、CREATE VIEW、CREATE TABLE和CREATE FUNCTION:- 預設排序規則是建立或更改對象的預設排序規則。
- 如果未指定任何
DEFAULT COLLATION子句,則預設的排序規則是UTF8_BINARY。
對於 DML 語句 (
UPDATE,DELETE FROM,INSERT,MERGE INTO) 和 Query,預設的排序為UTF8_BINARY。
定序優先順序
Azure Databricks 會套用排序優先順序規則來決定給定字串要使用哪種排序。 定義了四個優先級級:
明確
排序是透過
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隱含
該排序由 欄位名稱、 欄位名稱、欄位 別名、 變數名稱或 參數名稱 參考隱含指派,包括排序非 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', ',')預設
一個
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()所指派的彙整是 預設的彙整。
無
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 時,優先順序規則如下:
若表達式符合上述定義之一,則排序與優先順序即為定義。
若表達式為一個函數或運算子,且回
STRING傳STRING一個參數,則其排序與優先順序即為該STRING參數的排序。若表達式為包含兩個或以上
STRING參數的函數或運算子:若所有參數的排序與優先順序相同,結果則使用該排序與優先順序。
若參數有不同的排序或優先順序,則設
C1和C2為不同的排序,預設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 或區域特定彙整如 DE 或 FR_CI_AI 一起使用時,會產生錯誤。
受影響的函數包括 LIKE、 ILIKE、 RLIKE以及 函 regexp_* 數族。 若要與其他排序的欄位進行字串匹配,請使用 contains function、 startswith function 或 endswith function。