Classement
Essentiel
Cette fonctionnalité est en préversion publique.
S’applique à : Databricks SQL
Databricks Runtime 16.1 et versions ultérieures
Un classement est un ensemble de règles qui détermine la façon dont les comparaisons de chaînes sont effectuées. Les classements sont utilisés pour comparer les chaînes dans un ordre sensible à la casse, non sensible aux accents ou à l’espace de fin, ou pour trier les chaînes dans un ordre spécifique prenant en charge la langue.
Les chaînes dans Azure Databricks sont représentées sous forme de caractères UTF-8 encodés Unicode.
Par défaut, Azure Databricks compare les chaînes par leur représentation UTF8 binaire. Cela porte le nom de classement UTF8_BINARY
.
Les comparaisons UTF8_BINARY
sont rapides et appropriées dans de nombreux cas, mais peuvent ne pas convenir à toutes les applications, en particulier celles qui nécessitent un tri ou des comparaisons prenant en charge la langue.
Outre les comparaisons sensibles à la langue, un cas d’utilisation courant est l’application de l’insensibilité à la casse.
Azure Databricks a le classement UTF8_LCASE
spécifiquement à cet effet.
Il convertit les chaînes en minuscules avant de les comparer à l’aide du classement rapide UTF8_BINARY
.
Pour les comparaisons prenant en charge le langage, Azure Databricks utilise les technologies suivantes :
- Composants internationaux pour la bibliothèque Unicode (ICU) de calcul
- Référentiel de Données Locales Communes (CLDR) tables pour un classement spécifique prenant en compte les paramètres régionaux.
- Unicode Locale Data Markup Language (LDML) pour encoder les classements en interne.
Ces technologies sont encapsulées dans un ensemble de classements nommés qui peuvent être utilisés dans les instructions SQL.
Noms de classement
Étant donné que l’identification des classements par leur spécification LDML peut être complexe et difficile à lire, Azure Databricks propose un ensemble plus facile à utiliser de classements système nommés.
Syntaxe
{ UTF8_BINARY |
UTF8_LCASE |
{ UNICODE | locale } [ _ modifier [...] ] }
locale
language_code [ _ script_code ] [ _ country_code ]
modifier
{ CS | CI | AS | AI | RTRIM }
UTF8_BINARY
Un classement binaire méta-locale qui compare les chaînes de caractères octet par octet en fonction de la représentation en octets UTF-8.
UTF8_BINARY
est le classement par défaut et le plus léger pour la comparaison de chaînes dans Azure Databricks.Dans ce classement, ‘A’ (x’65’) < ‘B’ (x’66’) < … < ‘Z’ (x’90’).
Toutefois, ’Z’ (x’90’) < ’a’ (x’97’), et ’A’ (x’65’) <> ’a’ (x’97’).
En outre, les caractères tels que « Ä » (x’C384') sont supérieurs à « Z » et « z » dans ce classement.
UTF8_LCASE
Classement léger qui ne respecte pas la casse des méta-paramètres régionaux qui compare les chaînes à l’aide de leur représentation en octets UTF-8 après avoir converti les chaînes en minuscules.
UTF8_LCASE
est le classement utilisé pour les identificateurs dans Azure Databricks.Exemple :
ORDER BY col COLLATE UTF8_LCASE
équivaut à
ORDER BY LOWER(col) COLLATE UTF8_BINARY
UNICODE
Paramètres régionaux racine de l’ICU.
Ce classement, connu dans CLDR comme le locale « root » (spécification LDML : « und-u ») impose un ordre indépendant de la langue, qui cherche à être globalement intuitif. Dans ce classement, les caractères like sont regroupés. Par exemple : 'a' < 'A' < 'Ä' < 'b'. 'A' n’est pas considéré comme équivalent à 'a'. Par conséquent, le classement respecte la casse. 'a' n’est pas considéré comme équivalent à 'ä'. Par conséquent, le classement respecte les accents.
locale
Classement prenant en charge les paramètres régionaux basé sur les tables CLDR.
Les paramètres régionaux sont spécifiés sous la forme d’un code de langue, d’un code de script facultatif et d’un code de pays facultatif.
locale
ne respecte pas la casse.- language_code: un code de langue à deux lettres ISO 639-1.
- script_code: un code de script à quatre lettres ISO 15924.
- country_code : code du pays ISO 3166-1 alpha-3 à trois lettres.
modificateur
Spécifie le comportement de classement concernant la sensibilité de la casse et la sensibilité aux accents.
- CS : respecte la casse. Comportement par défaut.
- CI : ne respecte pas la casse.
- AS : respecte les accents. Comportement par défaut.
- IA : ne respecte pas les accents.
S’applique à :
Databricks Runtime 16.2 et versions ultérieures
- RTRIM : ne respecte pas les espaces de fin. Supprime les espaces de fin ("u0020") avant la comparaison.
S’applique à :
Databricks Runtime 16.2 et versions ultérieures
Vous pouvez spécifier
RTRIM
,CS
ouCI
, etAS
ouAI
au plus une fois et dans n’importe quel ordre. Les modificateurs eux-mêmes ne respectent pas la casse.
Lors du traitement d’un classement, Azure Databricks normalise les noms de classement en supprimant les valeurs par défaut.
Par exemple, SR_CYR_SRN_CS_AS
est normalisé en SR
.
Pour obtenir la liste des interclassements pris en charge, consultez Classements pris en charge.
Exemples
-- You can fully qualify collations, and case doesn't matter.
system.builtin.unicode
-- Since all collations are system defined you don't need to qualify them
unicode
-- Using 2-letter language code only for german collation
DE
-- Using 2-letter language code and 3-letter country code for french-canadian collation
-- It is common to use lower case 2-letter language codes and upper case 3-letter country codes
-- But collation names are case insensitive
fr_CAN
-- Using 2-letter language code and 4-letter script code and 3-letter country code for traditional chinese in Macao
zh_Hant_MAC
-- Using a 2 letter german language code and 2 modifiers for case insensitive and accent insensitive
-- So 'Ä', 'A', and 'a' are all considered equal
de_CI_AI
-- Using back ticks is allowed, but unnecessary for builtin collations
`UTF8_BINARY`
Collation par défaut
Le classement par défaut s’applique lors de l’utilisation de littéraux STRING
, de marqueurs de paramètres, de fonctions sans STRING
paramètres produisant des chaînes et lors de la définition de colonnes, de champs ou de types de variables sans clause COLLATE.
Le classement par défaut est dérivé dans UTF8_BINARY
.
Priorité du classement
Pour décider quel classement utiliser pour une chaîne donnée, Azure Databricks définit les règles de priorité de classement.
Les règles attribuent 4 niveaux de priorité aux classements :
Explicit
Le classement a été explicitement affecté à une chaîne en utilisant l’expression COLLATE.
Exemples
-- Force fast 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
Implicite
Le classement est implicitement affecté par la colonne , le champ , l’alias de colonne , la variable , ou la référence au paramètre de routine . Cela inclut le résultat d’une sous-requête tant que le classement n’est pas Aucun.
Exemples
-- Use the collation of the column as it was defined employee.name LIKE 'Mc%' -- Use the collation of the variable as it was defined. translate(session.tempvar, 'Z', ',')
Par défaut
Marqueur de paramètre littéral
STRING
, nommé ou non nommé, ouSTRING
produit par une fonction d’un autre type.Exemples
-- A literal string has the default collation 'Hello' -- :parm1 is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT :parm1' USING 'Hello' AS parm1; -- ? is a parameter marker using session default collation EXECUTE IMMEDIATE 'SELECT ?' USING 'Hello'; -- The result of a cast of a non-STRING to a STRING is a STRING with 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') -- The collation of the session_user STRING is the default collation session_user()
Le classement affecté est le classement par défaut.
Aucun
Résultat
STRING
d'une fonction, d'un opérateur ou d'une opération d'ensemble (par exemple,UNION
) qui accepte plusieurs argumentsSTRING
ayant des classements implicites différents.Exemples
-- 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 excplicit collations results in no collation SELECT 'Voulez vous ' COLLATE FR UNION ALL SELECT 'Kartoffelsupp...' COLLATE DE
Dérivation de classement
Lors de la dérivation du classement d’un résultat STRING
, les règles de priorité de classement sont appliquées de la manière suivante :
Si l’expression :
correspond aux définitions ci-dessus
Le classement et la priorité sont définis.
est une fonction ou un opérateur avec un seul paramètre de
STRING
, retournant unSTRING
Le classement et la priorité sont ceux du paramètre
STRING
.est une fonction ou un opérateur avec deux paramètres
STRING
ou plusavec les mêmes classements et priorités
Le classement et la priorité sont ceux des paramètres
STRING
.avec des classements ou des précédences différents
Laissez
C1
etC2
être des classements distincts et laissezD
être le classement par défaut. La priorité et le classement sont déterminés par le tableau suivant :Classement et priorité C1 explicite C1 implicite D Par défaut Aucun C2 explicite Erreur C2 Explicite C2 Explicite C2 Explicite C2 implicite C1 explicite Aucun C2 implicite Aucun D Par défaut C1 explicite C1 implicite D Par défaut Aucun Aucun C1 explicite Aucun Aucun Aucun
Exemples
> 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
-- Function modifying 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 collation German collides with implicit collation French
-- The result is 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
-- The explicit collation wins over no collation
> SELECT collation('Ciao' COLLATE IT || (fr || de)) FROM words;
IT
-- The implict collation (English) does not win over None
> SELECT collation(en || (fr || de)) FROM words;
null
-- The explicit collation (English) wins over Implicit collation anywhere in the expression
> SELECT collation((fr || ltrim('H' COLLATE EN, fr)) || fr) FROM words;
EN