Partager via


Classement

Essentiel

Cette fonctionnalité est en préversion publique.

S’applique à :case cochée oui Databricks SQL case cochée oui 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 :

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 à : case cochée oui 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 à :case cochée oui Databricks Runtime 16.2 et versions ultérieures

    Vous pouvez spécifier RTRIM, CS ou CI, et AS ou AI 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 :

  1. 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
    
  2. 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', ',')
    
  3. Par défaut

    Marqueur de paramètre littéral STRING, nommé ou non nommé, ou STRING 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.

  4. Aucun

    Résultat STRING d'une fonction, d'un opérateur ou d'une opération d'ensemble (par exemple, UNION) qui accepte plusieurs arguments STRING 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 :

  1. correspond aux définitions ci-dessus

    Le classement et la priorité sont définis.

  2. est une fonction ou un opérateur avec un seul paramètre de STRING, retournant un STRING

    Le classement et la priorité sont ceux du paramètre STRING.

  3. est une fonction ou un opérateur avec deux paramètres STRING ou plus

    1. avec les mêmes classements et priorités

      Le classement et la priorité sont ceux des paramètres STRING.

    2. avec des classements ou des précédences différents

      Laissez C1 et C2 être des classements distincts et laissez D ê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