Exigences relatives à l’identificateur

Identificateurs d’objet sans guillemets :

  • Commencent par une lettre (AZ, az) ou un trait de soulignement (« _ »).

  • Ne contiennent que des lettres, des traits de soulignement, des chiffres décimaux (0-9) et des signes dollar ($).

  • Sont insensibles à la casse.

Si vous mettez des guillemets doubles autour d’un identificateur (par ex. « Mon identificateur avec des blancs et des signes de ponctuation. »), les règles suivantes s’appliquent :

  • L’identificateur est sensible à la casse.

  • L’identificateur peut contenir et même commencer par n’importe quel caractère ASCII, du caractère vide (32) au tilde (126), à l’exclusion des guillemets doubles.

Note

  • Qu’un identificateur soit avec ou sans guillemets, le nombre maximum de caractères autorisé est de 255 (espaces compris).

  • Les identificateurs peuvent également être spécifiés à l’aide de littéraux de chaînes, de variables de session ou de variables de liaison. Pour plus de détails, voir Variables SQL.

Dans ce chapitre :

Identificateurs sans guillemets

Si un identificateur n’est pas placé entre guillemets doubles, il doit commencer par une lettre ou un trait de soulignement (_) et ne peut pas contenir de caractères étendus ni d’espaces.

Voici des exemples d’identificateurs valides ; toutefois, la casse des caractères de ces identificateurs ne serait pas conservée :

myidentifier
MyIdentifier1
My$identifier
_my_identifier

Identificateurs entre guillemets doubles

Les identificateurs délimités (c’est-à-dire les identificateurs entourés par des guillemets doubles) sont sensibles à la casse et peuvent commencer par et contenir tous les caractères valides, y compris :

  • Nombres

  • Caractères spéciaux (., ', !, @, #, $, %, ^, &, *, etc.)

  • Caractères ASCII étendus et non ASCII

  • Espaces vides

Par exemple :

"MyIdentifier"
"my.identifier"
"my identifier"
"My 'Identifier'"
"3rd_identifier"
"$Identifier"
"идентификатор"

Important

Si un objet est créé à l’aide d’un identificateur entre guillemets doubles, lorsqu’il est référencé dans une requête ou toute autre instruction SQL, l’identificateur doit être spécifié exactement tel qu’il a été créé, y compris avec les guillemets doubles. Le fait de ne pas inclure de guillemets peut entraîner une erreur Object does not exist (ou un type d’erreur similaire).

Notez également que l’identificateur complet doit être placé entre guillemets lorsqu’il est référencé dans une requête/instruction SQL. Cela est particulièrement important si des points (.) sont utilisés dans les identificateurs, car ils sont également utilisés dans des noms d’objet pleinement qualifiés pour séparer chaque objet.

Par exemple :

"My.DB"."My.Schema"."Table.1"

Résolution de l’identificateur

Par défaut, Snowflake applique les règles suivantes pour stocker les identificateurs (au moment de la création/définition) et les résoudre (dans les requêtes et autres instructions SQL) :

  • Lorsqu’un identificateur n’est pas entre guillemets, il est stocké et résolu en majuscules.

  • Lorsqu’un identificateur est entre guillemets doubles, il est stocké et résolu exactement tel qu’il a été saisi, casse incluse.

Par exemple, les quatre noms suivants sont équivalents et tous se résolvent dans TABLENAME :

TABLENAME
tablename
tableName
TableName

En revanche, les quatre noms suivants sont considérés comme des valeurs uniques et différentes :

"TABLENAME"
"tablename"
"tableName"
"TableName"

Si ces identificateurs étaient utilisés pour créer des objets du même type (p. ex. des tables), ils donneraient lieu à la création de quatre objets distincts.

Outils tiers et résolution d’identificateurs insensibles à la casse

Certaines applications tierces utilisent toujours des guillemets doubles pour les identificateurs dans les requêtes SQL qu’elles génèrent, ce qui peut entraîner des requêtes contenant des identificateurs qui ne peuvent pas être trouvés dans Snowflake en raison de différences de casse.

Contrôle de la casse à l’aide du paramètre QUOTED_IDENTIFIERS_IGNORE_CASE

Pour éviter que cette situation se produise, Snowflake fournit un paramètre de session, QUOTED_IDENTIFIERS_IGNORE_CASE, qui assure que tous les caractères alphabétiques des identificateurs créés dans la session sont stockés en majuscules, que l’identificateur soit entre guillemets doubles ou pas. Le paramètre par défaut est FALSE.

Pour modifier le comportement sensible à la casse pour les identificateurs entre guillemets doubles, définissez le paramètre sur TRUE pour la session. Par la suite, tous les caractères alphabétiques des identificateurs sont stockés en majuscules.

En d’autres termes, les éléments suivants seraient tous équivalents :

TABLENAME
tablename
tableName
TableName
"TABLENAME"
"tablename"
"tableName"
"TableName"

Notez que ce paramètre n’a aucune incidence sur les limites des identificateurs sans guillemets en ce qui concerne les nombres, les caractères étendus et les espaces vides.

Incidence de la modification du paramètre

Le changement du paramètre de session QUOTED_IDENTIFIERS_IGNORE_CASE n’affecte que les nouveaux objets et requêtes :

  • Avec la valeur par défaut de FALSE, si un objet est créé à l’aide d’un identificateur entre guillemets avec un mélange de casse, Snowflake stocke l’identificateur en casse mixte.

  • Si le paramètre passe ensuite à TRUE, l’identificateur de l’objet qui vient d’être créé n’est pas récupérable/résoluble.

Astuce

En raison de l’impact que la modification du paramètre peut avoir sur la résolution des identificateurs, nous vous recommandons fortement de choisir une méthode de résolution des identificateurs rapidement au début de votre implémentation de Snowflake et de déterminer le comportement par défaut en réglant le paramètre au niveau du compte en conséquence. N’importe quel administrateur du compte peut effectuer ce réglage pour votre compte. Le paramètre peut toujours être remplacé au niveau de la session, mais nous n’encourageons pas la modification du paramètre par défaut, sauf si vous en avez explicitement besoin.

Les exemples suivants illustrent le comportement après avoir passé le paramètre de FALSE à TRUE :

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "One" (i int);  -- stored as "One"

-- Create a table with an unquoted identifier
CREATE TABLE TWO(j int);     -- stored as "TWO"

-- These queries work
SELECT * FROM "One";         -- searches for "One"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"

-- These queries do not work
SELECT * FROM One;           -- searches for "ONE"
SELECT * FROM "Two";         -- searches for "Two"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- Create another table with a double-quoted identifier
CREATE TABLE "Three"(k int); -- stored as "THREE"

-- These queries work
SELECT * FROM "Two";         -- searches for "TWO"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"
SELECT * FROM "Three";       -- searches for "THREE"
SELECT * FROM three;         -- searches for "THREE"

-- This query does not work now - "One" is not retrievable
SELECT * FROM "One";         -- searches for "ONE"

De plus, si les identificateurs de deux tables ne diffèrent qu’au niveau de la casse, un identificateur peut se résoudre dans une table différente après avoir modifié le paramètre :

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "Tab" (i int);  -- stored as "Tab"

-- Create a table with an unquoted identifier
CREATE TABLE TAB(j int);     -- stored as "TAB"

-- This query retrieves "Tab"
SELECT * FROM "Tab"          -- searches for "Tab"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- This query retrieves "TAB"
SELECT * FROM "Tab"          -- searches for "TAB"