식별자 요구 사항(Identifier requirements)
식별자 요구 사항(Identifier requirements)
- 문자(A-Z, a-z) 또는 밑줄("_")로 시작합니다.
- 문자, 밑줄, 십진 숫자(0-9), 달러 기호("$")만 포함합니다.
- 대문자로 저장되고 해석됩니다(예:
id는ID로 저장 및 해석).
식별자에 큰따옴표를 씌우면(예: "My identifier with blanks and punctuation.") 다음 규칙이 적용됩니다.
- 식별자의 대소문자는 저장 및 해석 시 보존됩니다(예:
"id"는id로 저장 및 해석). - 식별자는 ASCII, 확장 ASCII, 비-ASCII 문자를 포함하고 시작할 수 있습니다. 인용된 식별자 안에서 큰따옴표 문자를 사용하려면 따옴표 두 개를 사용합니다. 예를 들어:
CREATE TABLE "quote""andunquote""" ...
이것은 다음 이름의 테이블을 생성합니다:
quote"andunquote"
여기서 따옴표는 이름의 일부입니다.
참고
- 식별자가 따옴표 없는(unquoted) 것이든 큰따옴표를 쓴 것이든, 허용되는 최대 문자 수는 255자입니다(공백 포함).
- 식별자는 문자열 리터럴, 세션 변수 또는 바인드 변수를 사용해서도 지정할 수 있습니다. 자세한 내용은 SQL variables를 참고하세요.
본문
따옴표 없는 식별자 (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"