Snowflake cloud data platform 雪花如何处理对象标识符中的大小写敏感度?

Snowflake cloud data platform 雪花如何处理对象标识符中的大小写敏感度?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,在Snowflake中,如果我运行以下命令: create temporary table "Tab" (i int); select * from "Tab"; -- this works select * from Tab; -- error 我得到以下错误: SQL编译错误:对象“选项卡”不存在或未授权 Snowflake声称未加引号的对象标识符不区分大小写。如果这是真的,为什么要找TAB?为什么它不承认Tab或Tab与Tab指的是同一件事?Sno

在Snowflake中,如果我运行以下命令:

create temporary table "Tab" (i int);
select * from "Tab"; -- this works
select * from Tab; -- error
我得到以下错误:

SQL编译错误:对象“选项卡”不存在或未授权


Snowflake声称未加引号的对象标识符不区分大小写。如果这是真的,为什么要找TAB?为什么它不承认Tab或Tab与Tab指的是同一件事?

Snowflake关于这一点的文档在技术上是不准确和误导的。现在已更新为:

不带引号的对象标识符。。。存储和解析为大写字符,例如id存储和解析为id

雪花中不带引号的标识符总是解析为所有大写字母

如果QUOTED_IDENTIFIERS_IGNORE_CASE参数从默认值FALSE更改为TRUE,则QUOTED标识符将具有相同的行为。尽管参数名不同,但这并不意味着标识符不区分大小写:它们只解析为所有大写字母,这与不带引号的标识符的行为相匹配

重要提示:这意味着,如果您创建任何表、字段等,并在其名称周围使用双引号,则使用默认设置QUOTED\u IDENTIFIERS\u IGNORE\u CASE=FALSE,并且引用的名称并非全部大写:

如果不使用带引号的标识符,您将永远无法引用该对象。 即使使用带引号的标识符,如果将带引号的标识符\u IGNORE\u CASE设置为TRUE,您也永远无法引用该对象。或者说: 如果参数随后更改为TRUE,则新创建对象的标识符不可检索/解析

知道了这一点,似乎最安全的方法是在您第一次开始使用Snowflake时,在帐户级别将QUOTED_IDENTIFIERS_IGNORE_CASE设置为TRUE,因此它成为默认策略。只要您保持该设置的一致性,那么无引号的对象标识符不区分大小写的语句对您来说将实际上是正确的

提供以下提示:

由于更改参数可能会对解析标识符产生影响,我们强烈建议在Snowflake实现的早期选择标识符解析方法,然后通过在帐户级别相应地设置参数来指定默认行为,任何帐户管理员都可以为您的帐户执行此操作。该参数始终可以在会话级别重写,但我们不鼓励从默认值更改该参数,除非您明确需要这样做

如果您需要能够区分大小写地引用某个内容,您可以更改该特定会话的引用的\u标识符\u忽略\u大小写设置。这些情况应该很少发生,因为在使用显示结果时(这是使用引用标识符的常见情况),将quoted_identifiers_IGNORE_case设置为TRUE可以通过一些我无法理解的魔法消除引用标识符的需要

alter session set quoted_identifiers_ignore_case = false;
show tables;

-- This fails because `name` resolves to `NAME` rather than `"name"`
select name
from table(result_scan(last_query_id()));

alter session set quoted_identifiers_ignore_case = true;
show tables;

-- This succeeds, for some reason, even though `name` still resolves to `NAME`.
select name
from table(result_scan(last_query_id()));

注意:数据库排序规则设置似乎对Snowflake中标识符的行为没有影响。

Snowflake在这一点上的文档在技术上不准确且具有误导性。现在已更新为:

不带引号的对象标识符。。。存储和解析为大写字符,例如id存储和解析为id

雪花中不带引号的标识符总是解析为所有大写字母

如果QUOTED_IDENTIFIERS_IGNORE_CASE参数从默认值FALSE更改为TRUE,则QUOTED标识符将具有相同的行为。尽管参数名不同,但这并不意味着标识符不区分大小写:它们只解析为所有大写字母,这与不带引号的标识符的行为相匹配

重要提示:这意味着,如果您创建任何表、字段等,并在其名称周围使用双引号,则使用默认设置QUOTED\u IDENTIFIERS\u IGNORE\u CASE=FALSE,并且引用的名称并非全部大写:

如果不使用带引号的标识符,您将永远无法引用该对象。 即使使用带引号的标识符,如果将带引号的标识符\u IGNORE\u CASE设置为TRUE,您也永远无法引用该对象。或者说: 如果参数随后更改为TRUE,则新创建对象的标识符不可检索/解析

知道了这一点,似乎最安全的方法是在您第一次开始使用Snowflake时,在帐户级别将QUOTED_IDENTIFIERS_IGNORE_CASE设置为TRUE,因此它成为默认策略。只要您保持该设置的一致性,那么无引号的对象标识符不区分大小写的语句对您来说将实际上是正确的

提供以下提示:

由于更改参数可能会对解析标识符产生影响,我们强烈建议您在实现Snowflake的早期选择标识符解析方法,然后指定 默认行为,在帐户级别相应地设置参数,任何帐户管理员都可以为您的帐户执行此操作。该参数始终可以在会话级别重写,但我们不鼓励从默认值更改该参数,除非您明确需要这样做

如果您需要能够区分大小写地引用某个内容,您可以更改该特定会话的引用的\u标识符\u忽略\u大小写设置。这些情况应该很少发生,因为在使用显示结果时(这是使用引用标识符的常见情况),将quoted_identifiers_IGNORE_case设置为TRUE可以通过一些我无法理解的魔法消除引用标识符的需要

alter session set quoted_identifiers_ignore_case = false;
show tables;

-- This fails because `name` resolves to `NAME` rather than `"name"`
select name
from table(result_scan(last_query_id()));

alter session set quoted_identifiers_ignore_case = true;
show tables;

-- This succeeds, for some reason, even though `name` still resolves to `NAME`.
select name
from table(result_scan(last_query_id()));

注意:数据库排序规则设置似乎对Snowflake中标识符的行为没有影响。

如上所述。在解析标识符时,Snowflake实际上将所有内容都转换为大写


如果您在Snowflake中生成查询或对象,这通常不是问题,但是当您从外部源(例如Python脚本或Alteryx工作流)生成查询或对象时,您需要确保使用外部资源中使用的确切大小写,因为Snowflake不会将这些对象名称转换为大写。因此,如果您使用Alteryx创建一个名为Record\u id的列,在snowflake中引用它的唯一方法就是实际尊重大小写:Record\u id。像Record\u id或Record\u id这样的东西会抛出一个无效的标识符错误。

如上所述。在解析标识符时,Snowflake实际上将所有内容都转换为大写


如果您在Snowflake中生成查询或对象,这通常不是问题,但是当您从外部源(例如Python脚本或Alteryx工作流)生成查询或对象时,您需要确保使用外部资源中使用的确切大小写,因为Snowflake不会将这些对象名称转换为大写。因此,如果您使用Alteryx创建一个名为Record\u id的列,在snowflake中引用它的唯一方法就是实际尊重大小写:Record\u id。诸如Record\u id或Record\u id之类的内容将抛出一个无效的标识符错误。

谢谢!我正在将此反馈反馈给文档团队。仅供参考,文档已经更新。让我知道你的想法-谢谢你的反馈@菲利佩霍法:谢谢。现在清楚多了!谢谢你,斯普林!我正在将此反馈反馈给文档团队。仅供参考,文档已经更新。让我知道你的想法-谢谢你的反馈@菲利佩霍法:谢谢。现在清楚多了!