标识符要求

未加引号的对象标识符

  • 以字母(A-Z,a-z)或下划线(“_”)开头。

  • 仅包含字母、下划线、十进制数字 (0-9) 和美元符号(“$”)。

  • 存储并解析为大写字符(例如,id 存储并解析为 ID)。

如果 在标识符两边加上双引号 (例如“我的标识符带有空格和标点符号。”),以下规则适用:

  • 存储和解析标识符时会保留标识符的大小写(例如,"id" 被存储并解析为 id)。

  • 标识符可以包含 ASCII、扩展 ASCII 和非 ASCII 字符,并以这些字符开头。

    若要在带引号的标识符中使用双引号字符,请使用两个引号。例如:

    CREATE TABLE "quote""andunquote""" ...
    
    Copy

    创建具有以下名称的表:

    quote"andunquote"
    
    Copy

    其中引号是名称的一部分。

备注

  • 无论标识符是不带引号还是带双引号,允许的最大字符数为 255(包括空格)。

  • 还可以使用字符串字面量、会话变量或绑定变量指定标识符。有关详细信息,请参阅 SQL 变量

本主题内容:

未加引号的标识符

如果标识符没有用双引号括起来,必须以字母或下划线 (_) 开头,并且不能包含扩展字符或空格。

以下是有效标识符的所有示例;但是,不会保留这些标识符中字符的大小写:

myidentifier
MyIdentifier1
My$identifier
_my_identifier
Copy

未加引号的标识符以大写形式存储和 解析。因此,未加引号的标识符等同于具有相同名称的已加双引号的大写标识符。例如,以下两条语句尝试创建同一个表:

CREATE TABLE mytable(c1 INT, c2 INT);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+
CREATE TABLE "MYTABLE"(c1 INT, c2 INT);
Copy
002002 (42710): SQL compilation error:
Object 'MYTABLE' already exists.

加双引号的标识符

带分隔符的标识符(即用双引号括起来的标识符)区分大小写,可以以任何有效字符开头并包含任何有效字符,包括:

  • 数字

  • 特殊字符(.'!@#$%^&* 等)

  • 扩展 ASCII 字符和非 ASCII 字符

  • 空格

例如:

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

重要

如果对象是使用双引号标识符创建的,则在查询或任何其他 SQL 语句中引用时,必须在创建时 准确 指定标识符,包括双引号。未包含引号可能会导致 Object does not exist 错误(或类似类型的错误)。

另请注意,在查询/SQL 语句中引用时,整个标识符必须用引号括起来。如果在标识符中使用句点 (.),这一点尤其重要,因为句点也用于完全限定的对象名称中以分隔每个对象。

例如:

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

异常

  • 处理程序语言为 Java、JavaScript、Snowflake Scripting 或 SQL 的 用户定义函数 (UDFs) 和过程的名称 不支持双引号标识符。

  • 处理程序语言为 Java 的用户定义函数 (UDFs) 和过程的名称只能使用 ASCII 字符。

标识符解析

默认情况下,Snowflake 应用以下规则来存储标识符(在创建/定义时)和解析标识符(在查询和其他 SQL 语句中):

  • 当标识符不带引号时,将以大写形式存储和解析。

  • 当标识符使用双引号时,将完全按照输入的内容进行存储和解析,包括大小写。

例如,以下四个名称是等效的,并且都解析为 TABLENAME

TABLENAME
tablename
tableName
TableName
Copy

相比之下,以下四个名称被认为是不同的唯一值:

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

如果这些标识符用于创建相同类型的对象(例如表),则它们将导致创建四个不同的对象。

从将双引号标识符视为不区分大小写的数据库迁移

在 SQL 的 ANSI/ISO 标准中,双引号中的标识符(分隔标识符)区分大小写。但是,某些公司提供的数据库将双引号标识符视为不区分大小写。

如果要将数据和应用程序从其中一个数据库迁移到 Snowflake,则这些应用程序可能会在不区分大小写的标识符周围使用双引号。这可能会阻止 Snowflake 正确解析标识符。例如,应用程序可能在小写的标识符周围使用双引号,而 Snowflake 数据库的标识符为大写。

为了解决这一限制,Snowflake 提供 QUOTED_IDENTIFIERS_IGNORE_CASE 会话参数,该参数使 Snowflake 在创建和查找对象时将双引号标识符中的小写字母视为大写字母。

有关详细信息,请参阅以下部分:

备注

更改参数的值可能会影响查找现有对象的能力。有关详细信息,请参阅 更改参数的影响

使用 QUOTED_IDENTIFIERS_IGNORE_CASE 参数控制大小写

要将 Snowflake 配置为在会话中将双引号标识符中的字母字符视为大写字符,请将该会话的参数设置为 TRUE。使用此设置时,标识符中的所有字母字符都将存储并解析为大写字符。

换句话说,以下八个名称是等效的,并且都解析为 TABLENAME

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

请注意,该参数对未加引号的标识符在数字、扩展字符和空格方面的任何限制都没有影响。

更改参数的影响

更改 QUOTED_IDENTIFIERS_IGNORE_CASE 会话参数只会影响 对象和查询:

  • 在默认设置为 FALSE 的情况下,如果使用大小写混合的双引号标识符创建对象,Snowflake 会以大小写混合的形式存储标识符。

  • 如果该参数后来更改为 TRUE,Snowflake 将无法解析该双引号混合大小写标识符,也无法检索该对象。

小技巧

由于更改参数可能会对解析标识符产生影响,我们 强烈 建议在实现 Snowflake 的早期选择标识符解析方法。然后,让账户管理员在账户级别设置参数,以默认强制执行此解析方法。

尽管可以在会话级别替换此参数,但我们不鼓励从默认值更改参数,除非明确需要这样做。

以下示例说明了将参数从 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"
Copy

此外,如果两个表的标识符仅因大小写而异,则在更改参数后,一个标识符可能会解析为不同的表:

-- 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"
Copy
语言: 中文