Anforderungen an Bezeichner¶
Objektbezeichner ohne Anführungszeichen:
Beginnen Sie mit einem Buchstaben (A-Z, a-z) oder einem Unterstrich („_“).
Enthalten nur Buchstaben, Unterstriche, Dezimalstellen (0-9) und Dollarzeichen („$“).
Groß-/Kleinschreibung wird nicht unterschieden.
Wenn Sie einen Bezeichner in doppelte Anführungszeichen setzen (z. B. „Mein Bezeichner mit Leerzeichen und Interpunktion“) gelten folgende Regeln:
Der Bezeichner unterscheidet zwischen Groß- und Kleinschreibung.
Der Bezeichner kann ein beliebiges ASCII-Zeichen vom Leerzeichen (32) bis zur Tilde (126) enthalten und sogar damit beginnen.
Für die Verwendung von doppelten Anführungszeichen innerhalb eines Bezeichners muss dieser in doppelte Anführungszeichen eingeschlossen werden. Beispiel:
create table "quote""andunquote""" ...
erstellt eine Tabelle namens:
quote"andunquote"
wobei die Anführungszeichen Teil des Namens sind.
Bemerkung
Unabhängig davon, ob ein Bezeichner keine oder doppelte Anführungszeichen enthält, dürfen maximale nur 255 Zeichen (einschließlich Leerzeichen) verwendet werden.
Bezeichner können auch durch Zeichenfolgenliterale, Sitzungsvariablen oder Bindungsvariablen spezifiziert werden. Weitere Details dazu finden Sie unter SQL-Variablen.
Unter diesem Thema:
Bezeichner ohne Anführungszeichen¶
Wenn ein Bezeichner nicht in doppelte Anführungszeichen eingeschlossen ist, muss er mit einem Buchstaben oder einem Unterstrich (_
) beginnen und darf keine Sonderzeichen oder Leerzeichen enthalten.
Im Folgenden finden Sie alle Beispiele für gültige Bezeichner. Die Groß-/Kleinschreibung der Zeichen in diesen Bezeichnern wird allerdings nicht beibehalten:
myidentifier MyIdentifier1 My$identifier _my_identifier
Bezeichner mit doppelten Anführungszeichen¶
Bei Bezeichnern mit Trennzeichen, die von doppelten Anführungszeichen eingeschlossen sind, muss die Groß-/Kleinschreibung beachtet werden, und sie können mit allen gültigen Zeichen beginnen und alle gültigen Zeichen enthalten, einschließlich:
Zahlen
Sonderzeichen (
.
,'
,!
,@
,#
,$
,%
,^
,&
,*
usw.)ASCII- und Nicht-ASCII-Sonderzeichen
Leerzeichen
Beispiel:
"MyIdentifier" "my.identifier" "my identifier" "My 'Identifier'" "3rd_identifier" "$Identifier" "идентификатор"
Wichtig
Wenn ein Objekt mit einem Bezeichner in doppelten Anführungszeichen erstellt wird, muss der Bezeichner bei Bezugnahme in einer Abfrage oder einer anderen SQL-Anweisung exakt wie erstellt angegeben werden, einschließlich der doppelten Anführungszeichen. Fehlende Anführungszeichen können zu einem Object does not exist
-Fehler (oder einer ähnlichen Art von Fehler) führen.
Beachten Sie außerdem, dass der gesamte Bezeichner in Anführungszeichen eingeschlossen sein muss, wenn auf ihn in einer Abfrage oder SQL-Anweisung verwiesen wird. Dies ist besonders wichtig, wenn Punkte (.
) in Bezeichnern verwendet werden, da Punkte auch in vollqualifizierten Objektnamen zum Trennen der einzelnen Objekte verwendet werden.
Beispiel:
"My.DB"."My.Schema"."Table.1"
Auflösung des Bezeichners¶
Standardmäßig wendet Snowflake die folgenden Regeln an, um Bezeichner zu speichern (zur Erstellungs-/Definitionszeit) und aufzulösen (in Abfragen und anderen SQL-Anweisungen):
Wenn ein Bezeichner nicht in Anführungszeichen gesetzt wird, wird er in Großbuchstaben gespeichert und aufgelöst.
Wenn ein Bezeichner in doppelte Anführungszeichen gesetzt wird, wird er genau so gespeichert und aufgelöst, wie er eingegeben wurde, einschließlich Groß-/Kleinschreibung.
Beispielsweise sind die folgenden Namen äquivalent und werden alle zu TABLENAME
aufgelöst:
TABLENAME tablename tableName TableName
Im Gegensatz dazu werden die folgenden vier Namen als unterschiedliche, eindeutige Werte betrachtet:
"TABLENAME" "tablename" "tableName" "TableName"
Würden diese Bezeichner verwendet, um Objekte des gleichen Typs (z. B. Tabellen) zu erstellen, würde dies zur Erstellung von vier verschiedenen Objekten führen.
Tools von Drittanbietern und Bezeichnerauflösung unter Berücksichtigung der Groß-/Kleinschreibung¶
Einige Drittanbieteranwendungen verwenden immer doppelte Anführungszeichen für Bezeichner in den von ihnen generierten SQL-Abfragen, was zu Abfragen mit Bezeichnern führen kann, die in Snowflake aufgrund von Unterschieden in der Groß-/Kleinschreibung nicht gefunden werden können.
Steuern der Groß-/Kleinschreibung mit dem Parameter QUOTED_IDENTIFIERS_IGNORE_CASE¶
Um dies zu verhindern, stellt Snowflake den Sitzungsparameter QUOTED_IDENTIFIERS_IGNORE_CASE zur Verfügung, der sicherstellt, dass alle alphabetischen Zeichen in Bezeichnern, die innerhalb der Sitzung erstellt wurden, in Großbuchstaben gespeichert werden, unabhängig davon, ob der Bezeichner in doppelten Anführungszeichen steht. Die Voreinstellung für den Parameter ist FALSE.
Um das Verhalten bei Bezeichnern mit doppelten Anführungszeichen, bei denen die Groß- und Kleinschreibung beachtet werden muss, zu ändern, setzen Sie den Parameter für die Sitzung auf TRUE. Danach werden alle alphabetischen Zeichen in Bezeichnern in Großbuchstaben gespeichert.
Mit anderen Worten, alle folgenden Varianten wären gleichwertig:
TABLENAME tablename tableName TableName "TABLENAME" "tablename" "tableName" "TableName"
Beachten Sie, dass der Parameter keine der Einschränkungen beeinflusst, die für Bezeichner ohne Anführungszeichen hinsichtlich Zahlen, Sonderzeichen und Leerzeichen gelten.
Auswirkungen der Änderung des Parameters¶
Das Ändern des Sitzungsparameters QUOTED_IDENTIFIERS_IGNORE_CASE wirkt sich nur auf neue Objekte und Abfragen aus:
Wenn ein Objekt mit einem Bezeichner mit gemischter Groß- und Kleinschreibung in doppelten Anführungszeichen erstellt wird, speichert Snowflake bei der Standardeinstellung FALSE den Bezeichner mit gemischter Groß-/Kleinschreibung.
Wenn der Parameter dann in TRUE geändert wird, ist der Bezeichner für das neu erstellte Objekt nicht abrufbar/auflösbar.
Tipp
Aufgrund der Auswirkungen, die die Änderung des Parameters auf die Auflösung von Bezeichnern haben kann, empfehlen wir nachdrücklich, frühzeitig bei Ihrer Implementierung von Snowflake eine Bezeichnerauflösungsmethode zu wählen und dann das Standardverhalten festzulegen, indem Sie den Parameter auf der Kontoebene entsprechend einstellen. Dies kann von jedem Kontoadministrator für Ihr Konto durchgeführt werden. Der Parameter kann immer auf Sitzungsebene überschrieben werden, aber wir empfehlen, den Standardwert des Parameters nicht zu ändern, es sei denn, dies ist ausdrücklich erforderlich.
Die folgenden Beispiele veranschaulichen das Verhalten nach der Änderung des Parameters von FALSE in 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"
Wenn sich die Bezeichner für zwei Tabellen nur von Fall zu Fall unterscheiden, kann ein Bezeichner nach Änderung des Parameters in eine andere Tabelle aufgelöst werden:
-- 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"