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 („$“).

  • Are stored and resolved as uppercase characters (e.g. id is stored and resolved as ID).

Wenn Sie einen Bezeichner in doppelte Anführungszeichen setzen (z. B. „Mein Bezeichner mit Leerzeichen und Interpunktion“) gelten folgende Regeln:

  • The case of the identifier is preserved when storing and resolving the identifier (e.g. "id" is stored and resolved as id).

  • The identifier can contain and can even start with any ASCII character from the blank character (32) to the tilde (126).

    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.

Migrating From Databases That Treat Double-Quoted Identifiers as Case-insensitive

In the ANSI/ISO standard for SQL, identifiers in double quotes (delimited identifiers) are treated as case-sensitive. However, some companies provide databases that treat double-quoted identifiers as case-insensitive.

If you are migrating your data and applications from one of these databases to Snowflake, those applications might use double quotes around identifiers that are intended to be case-insensitive. This can prevent Snowflake from resolving the identifiers correctly. For example, an application might use double quotes around an identifier in lowercase, and the Snowflake database has the identifier in uppercase.

To work around this limitation, Snowflake provides the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter, which causes Snowflake to treat lowercase letters in double-quoted identifiers as uppercase when creating and finding objects.

See the next sections for details:

Bemerkung

Changing the value of the parameter can affect your ability to find existing objects. See Auswirkungen der Änderung des Parameters for details.

Steuern der Groß-/Kleinschreibung mit dem Parameter QUOTED_IDENTIFIERS_IGNORE_CASE

To configure Snowflake to treat alphabetic characters in double-quoted identifiers as uppercase for the session, set the parameter to TRUE for the session. With this setting, all alphabetical characters in identifiers are stored and resolved as uppercase characters.

In other words, the following eight names are equivalent and all resolve to TABLENAME:

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

Note that the parameter has no effect on any of the limitations for unquoted identifiers with regards to numbers, extended characters, and blank spaces.

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.

  • If the parameter is later changed to TRUE, Snowflake will not be able to resolve that double-quoted mixed case identifier and will not be able retrieve that object.

Tipp

Due to the impact that changing the parameter can have on resolving identifiers, we highly recommend choosing the identifier resolution method early in your implementation of Snowflake. Then, have your account administrator set the parameter at the account level to enforce this resolution method by default.

Although you can override this parameter at the session level, we don’t encourage changing the parameter from the default, unless you have an explicit need to do so.

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"