标识符要求¶
以字母(A-Z,a-z)或下划线(“_”)开头。
仅包含字母、下划线、十进制数字 (0-9) 和美元符号(“$”)。
存储并解析为大写字符(例如,
id
存储并解析为ID
)。
如果 在标识符两边加上双引号 (例如“我的标识符带有空格和标点符号。”),以下规则适用:
存储和解析标识符时会保留标识符的大小写(例如,
"id"
被存储并解析为id
)。标识符可以包含 ASCII、扩展 ASCII 和非 ASCII 字符,并以这些字符开头。
若要在带引号的标识符中使用双引号字符,请使用两个引号。例如:
CREATE TABLE "quote""andunquote""" ...
创建具有以下名称的表:
quote"andunquote"
其中引号是名称的一部分。
备注
无论标识符是不带引号还是带双引号,允许的最大字符数为 255(包括空格)。
还可以使用字符串字面量、会话变量或绑定变量指定标识符。有关详细信息,请参阅 SQL 变量。
本主题内容:
未加引号的标识符¶
如果标识符没有用双引号括起来,必须以字母或下划线 (_
) 开头,并且不能包含扩展字符或空格。
以下是有效标识符的所有示例;但是,不会保留这些标识符中字符的大小写:
myidentifier
MyIdentifier1
My$identifier
_my_identifier
未加引号的标识符以大写形式存储和 解析。因此,未加引号的标识符等同于具有相同名称的已加双引号的大写标识符。例如,以下两条语句尝试创建同一个表:
CREATE TABLE mytable(c1 INT, c2 INT);
+-------------------------------------+
| status |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+
CREATE TABLE "MYTABLE"(c1 INT, c2 INT);
002002 (42710): SQL compilation error:
Object 'MYTABLE' already exists.
加双引号的标识符¶
带分隔符的标识符(即用双引号括起来的标识符)区分大小写,可以以任何有效字符开头并包含任何有效字符,包括:
数字
特殊字符(
.
、'
、!
、@
、#
、$
、%
、^
、&
、*
等)扩展 ASCII 字符和非 ASCII 字符
空格
例如:
"MyIdentifier"
"my.identifier"
"my identifier"
"My 'Identifier'"
"3rd_identifier"
"$Identifier"
"идентификатор"
重要
如果对象是使用双引号标识符创建的,则在查询或任何其他 SQL 语句中引用时,必须在创建时 准确 指定标识符,包括双引号。未包含引号可能会导致 Object does not exist
错误(或类似类型的错误)。
另请注意,在查询/SQL 语句中引用时,整个标识符必须用引号括起来。如果在标识符中使用句点 (.
),这一点尤其重要,因为句点也用于完全限定的对象名称中以分隔每个对象。
例如:
"My.DB"."My.Schema"."Table.1"
异常¶
处理程序语言为 Java、JavaScript、Snowflake Scripting 或 SQL 的 用户定义函数 (UDFs) 和过程的名称 不支持双引号标识符。
处理程序语言为 Java 的用户定义函数 (UDFs) 和过程的名称只能使用 ASCII 字符。
标识符解析¶
默认情况下,Snowflake 应用以下规则来存储标识符(在创建/定义时)和解析标识符(在查询和其他 SQL 语句中):
当标识符不带引号时,将以大写形式存储和解析。
当标识符使用双引号时,将完全按照输入的内容进行存储和解析,包括大小写。
例如,以下四个名称是等效的,并且都解析为 TABLENAME
:
TABLENAME
tablename
tableName
TableName
相比之下,以下四个名称被认为是不同的唯一值:
"TABLENAME"
"tablename"
"tableName"
"TableName"
如果这些标识符用于创建相同类型的对象(例如表),则它们将导致创建四个不同的对象。
从将双引号标识符视为不区分大小写的数据库迁移¶
在 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"
请注意,该参数对未加引号的标识符在数字、扩展字符和空格方面的任何限制都没有影响。
更改参数的影响¶
更改 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"
此外,如果两个表的标识符仅因大小写而异,则在更改参数后,一个标识符可能会解析为不同的表:
-- 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"