식별자 요구 사항(Identifier requirements)

식별자 요구 사항(Identifier requirements)

따옴표 없는 객체 식별자:

  • 문자(A-Z, a-z) 또는 밑줄("_")로 시작합니다.
  • 문자, 밑줄, 십진 숫자(0-9), 달러 기호("$")만 포함합니다.
  • 대문자로 저장되고 해석됩니다(예: idID로 저장 및 해석).

식별자에 큰따옴표를 씌우면(예: "My identifier with blanks and punctuation.") 다음 규칙이 적용됩니다.

  • 식별자의 대소문자는 저장 및 해석 시 보존됩니다(예: "id"id로 저장 및 해석).
  • 식별자는 ASCII, 확장 ASCII, 비-ASCII 문자를 포함하고 시작할 수 있습니다. 인용된 식별자 안에서 큰따옴표 문자를 사용하려면 따옴표 두 개를 사용합니다. 예를 들어:
CREATE TABLE "quote""andunquote""" ...

이것은 다음 이름의 테이블을 생성합니다:

quote"andunquote"

여기서 따옴표는 이름의 일부입니다.

참고

  • 식별자가 따옴표 없는(unquoted) 것이든 큰따옴표를 쓴 것이든, 허용되는 최대 문자 수는 255자입니다(공백 포함).
  • 식별자는 문자열 리터럴, 세션 변수 또는 바인드 변수를 사용해서도 지정할 수 있습니다. 자세한 내용은 SQL variables를 참고하세요.

출처: Snowflake SQL Reference

본문

따옴표 없는 식별자 (Unquoted identifiers)

식별자가 큰따옴표로 감싸지지 않았다면 문자 또는 밑줄(_)로 시작해야 하며 확장 문자나 공백을 포함할 수 없습니다.

다음은 모두 유효한 식별자의 예입니다. 다만 이 식별자들의 문자의 대소문자는 보존되지 않습니다:

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.

큰따옴표 식별자 (Double-quoted identifiers)

구분 식별자(delimited identifier, 즉 큰따옴표로 감싼 식별자)는 대소문자를 구분하며 다음을 포함해 유효한 문자로 시작하고 포함할 수 있습니다.

  • 숫자
  • 특수 문자(., ', !, @, #, $, %, ^, &, * 등)
  • 확장 ASCII 및 비-ASCII 문자
  • 공백

예를 들어:

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

중요: 객체가 큰따옴표 식별자로 생성되었다면, 쿼리나 다른 SQL 문장에서 참조할 때 큰따옴표를 포함해 생성된 그대로 정확히 지정해야 합니다. 따옴표를 포함하지 않으면 Object does not exist(또는 그와 유사한) 오류가 발생할 수 있습니다.

또한 쿼리/SQL 문장에서 참조할 때 식별자 전체를 따옴표로 감싸야 합니다. 식별자에 마침표(.)가 사용되는 경우 특히 중요합니다. 마침표는 정규화된 객체 이름에서 각 객체를 구분하는 데에도 사용되기 때문입니다.

예를 들어:

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

예외 (Exceptions)

  • 핸들러 언어가 Java, JavaScript, Snowflake Scripting 또는 SQL인 사용자 정의 함수(UDF)와 프로시저의 이름에는 큰따옴표 식별자가 지원되지 않습니다.
  • 핸들러 언어가 Java인 사용자 정의 함수(UDF)와 프로시저의 이름에는 ASCII 문자만 사용할 수 있습니다.

식별자 해석 (Identifier resolution)

기본적으로 Snowflake는 식별자 저장(생성/정의 시점)과 해석(쿼리 및 기타 SQL 문장)에 다음 규칙을 적용합니다.

  • 식별자가 따옴표 없으면 대문자로 저장 및 해석됩니다.
  • 식별자가 큰따옴표를 썼으면 대소문자를 포함해 입력된 그대로 저장 및 해석됩니다.

예를 들어 다음 네 이름은 동등하며 모두 TABLENAME으로 해석됩니다:

TABLENAME
tablename
tableName
TableName

반대로 다음 네 이름은 서로 다르고 고유한 값으로 간주됩니다:

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

이 식별자들이 같은 타입의 객체(예: 테이블)를 만드는 데 사용된다면 네 개의 서로 다른 객체가 생성됩니다.

큰따옴표 식별자를 대소문자 무시로 취급하는 데이터베이스에서 마이그레이션

ANSI/ISO SQL 표준에서 큰따옴표 안의 식별자(구분 식별자)는 대소문자를 구분하는 것으로 취급됩니다. 그러나 일부 회사는 큰따옴표 식별자를 대소문자 무시로 취급하는 데이터베이스를 제공합니다.

이러한 데이터베이스 중 하나에서 Snowflake로 데이터와 애플리케이션을 마이그레이션한다면, 그 애플리케이션들은 대소문자 무시를 의도한 식별자 주변에 큰따옴표를 사용할 수 있습니다. 이는 Snowflake가 식별자를 올바르게 해석하지 못하게 할 수 있습니다. 예를 들어 애플리케이션은 소문자의 식별자 주변에 큰따옴표를 사용할 수 있는데, Snowflake 데이터베이스에는 그 식별자가 대문자로 있습니다.

이 제약을 우회하기 위해 Snowflake는 QUOTED_IDENTIFIERS_IGNORE_CASE 세션 파라미터를 제공합니다. 이 파라미터는 객체를 만들고 찾을 때 큰따옴표 식별자의 소문자를 대문자로 취급하게 합니다.

자세한 내용은 다음 섹션을 참고하세요.

  • QUOTED_IDENTIFIERS_IGNORE_CASE 파라미터로 대소문자 제어
  • 파라미터 변경의 영향

참고: 파라미터 값을 변경하면 기존 객체를 찾는 능력에 영향을 줄 수 있습니다. 자세한 내용은 파라미터 변경의 영향을 참고하세요.

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"

더 알아보기 (Learn more)