Requisitos para identificadores¶
Identificadores de objetos não delimitados por aspas:
Começam com uma letra (A-Z, a-z) ou um sublinhado (“_”).
Contêm somente letras, sublinhados, dígitos decimais (0-9) e cifrões (“$”).
São armazenados e resolvidos como caracteres maiúsculos (por exemplo,
id
é armazenado e resolvido comoID
).
Se você colocar um identificador entre aspas duplas (por exemplo, “Meu identificador com espaços em branco e pontuação.”), aplicam-se as seguintes regras:
As letras maiúsculas/minúsculas do identificador são preservadas ao armazenar e resolver o identificador (por exemplo,
"id"
é armazenado e resolvido comoid
).O identificador pode conter e começar com ASCII, ASCII estendido e caracteres não-ASCII.
Para usar o caractere de aspas duplas dentro de um identificador entre aspas, use duas aspas. Por exemplo:
create table "quote""andunquote""" ...
cria uma tabela chamada:
quote"andunquote"
em que as aspas fazem parte do nome.
Nota
Independentemente de um identificador não estar entre aspas ou estar entre aspas duplas, o número máximo de caracteres permitido é 255 (incluindo espaços em branco).
Os identificadores também podem ser especificados usando-se literais de cadeia de caracteres, variáveis de sessão ou variáveis de vinculação. Para obter mais detalhes, consulte Variáveis SQL.
Neste tópico:
Identificadores não delimitados por aspas¶
Se um identificador não estiver entre aspas duplas, ele deve começar com uma letra ou sublinhado (_
) e não pode conter caracteres estendidos ou espaços em branco.
A seguir estão todos os exemplos de identificadores válidos; entretanto, as letras maiúsculas/minúsculas dos caracteres desses identificadores não seriam preservadas:
myidentifier MyIdentifier1 My$identifier _my_identifier
Identificadores entre aspas duplas¶
Os identificadores delimitados (ou seja, identificadores entre aspas duplas) diferenciam maiúsculas e minúsculas, além disso podem começar e conter quaisquer caracteres válidos, inclusive:
Números
Caracteres especiais (
.
,'
,!
,@
,#
,$
,%
,^
,&
,*
etc.)Caracteres ASCII estendidos e não ASCII
Espaços em branco
Por exemplo:
"MyIdentifier" "my.identifier" "my identifier" "My 'Identifier'" "3rd_identifier" "$Identifier" "идентификатор"
Importante
Se um objeto for criado usando um identificador entre aspas duplas, quando referenciado em uma consulta ou qualquer outra instrução SQL, o identificador deve ser especificado exatamente como criado, incluindo as aspas duplas. A não inclusão das aspas pode resultar em um erro Object does not exist
(ou um tipo similar de erro).
Observe também que o identificador inteiro deve estar entre aspas quando referenciado em uma consulta/instrução SQL. Isso é particularmente importante se forem usados pontos finais (.
) em identificadores, pois os pontos finais também são usados em nomes de objetos totalmente qualificados para separar cada objeto.
Por exemplo:
"My.DB"."My.Schema"."Table.1"
Exceções¶
Identificadores entre aspas duplas não são suportados para nomes de funções definidas pelo usuário (UDFs) e procedimentos nos quais a linguagem do manipulador é Java, JavaScript, Script Snowflake ou SQL.
Você pode usar apenas caracteres ASCII para nomes de funções definidas pelo usuário (UDFs) e procedimentos em que a linguagem do manipulador seja Java.
Resolução do identificador¶
Por padrão, o Snowflake aplica as seguintes regras para armazenar identificadores (no momento da criação/definição) e resolvê-los (em consultas e outras instruções SQL):
Quando um identificador não está entre aspas, ele é armazenado e resolvido em letras maiúsculas.
Quando um identificador está entre aspas duplas, ele é armazenado e resolvido exatamente como inserido, incluindo maiúsculas/minúsculas.
Por exemplo, os quatro nomes a seguir são equivalentes e todos se resolvem como TABLENAME
:
TABLENAME tablename tableName TableName
Em contraste, os quatro nomes a seguir são considerados valores diferentes e únicos:
"TABLENAME" "tablename" "tableName" "TableName"
Se esses identificadores fossem usados para criar objetos do mesmo tipo (por exemplo, tabelas), eles resultariam na criação de quatro objetos distintos.
Migração de bancos de dados que tratam identificadores entre aspas duplas com distinção de maiúsculas/minúsculas¶
No padrão ANSI/ISO para SQL, os identificadores entre aspas duplas (identificadores delimitados) diferenciam maiúsculas e minúsculas. Entretanto, algumas empresas fornecem bancos de dados que tratam os identificadores entre aspas duplas sem diferenciar maiúsculas e minúsculas.
Se você estiver migrando seus dados e aplicativos de um desses bancos de dados para o Snowflake, esses aplicativos podem usar aspas duplas delimitando identificadores que não devem diferenciar maiúsculas de minúsculas. Isso pode impedir que o Snowflake resolva os identificadores corretamente. Por exemplo, um aplicativo pode usar aspas duplas delimitando um identificador em minúsculas, e o banco de dados do Snowflake tem o identificador em maiúsculas.
Para contornar essa limitação, o Snowflake fornece o parâmetro de sessão QUOTED_IDENTIFIERS_IGNORE_CASE, que faz com que o Snowflake trate as letras minúsculas dos identificadores entre aspas duplas como maiúsculas ao criar e encontrar objetos.
Consulte as próximas seções para obter detalhes:
Nota
A alteração do valor do parâmetro pode afetar sua capacidade de encontrar objetos existentes. Consulte Impacto da alteração de parâmetro para obter mais detalhes.
Controle de maiúsculas/minúsculas usando o parâmetro QUOTED_IDENTIFIERS_IGNORE_CASE¶
Para configurar o Snowflake para tratar os caracteres alfabéticos de identificadores entre aspas duplas como maiúsculas para a sessão, defina o parâmetro como TRUE para a sessão. Com essa configuração, todos os caracteres alfabéticos em identificadores são armazenados e resolvidos como caracteres maiúsculos.
Em outras palavras, os oito nomes a seguir são equivalentes e todos se resolvem como TABLENAME
:
TABLENAME tablename tableName TableName "TABLENAME" "tablename" "tableName" "TableName"
Observe que o parâmetro não tem efeito sobre limitações para identificadores não delimitados por aspas no que diz respeito a números, caracteres estendidos e espaços em branco.
Impacto da alteração de parâmetro¶
A alteração do parâmetro de sessão QUOTED_IDENTIFIERS_IGNORE_CASE afeta somente novos objetos e consultas:
Com a configuração padrão de FALSE, se um objeto for criado usando um identificador entre aspas duplas contendo uma mistura de maiúsculas e minúsculas, o Snowflake armazena o identificador com maiúsculas e minúsculas.
Se o parâmetro for alterado depois para TRUE, o Snowflake não será capaz de resolver esse identificador entre aspas duplas com a mistura de maiúsculas e minúsculas, além disso, ele não será capaz de recuperar esse objeto.
Dica
Devido ao impacto que a alteração do parâmetro pode ter na resolução de identificadores, recomendamos enfaticamente escolher o método de resolução de identificadores no início de sua implementação do Snowflake. Em seguida, peça ao administrador da conta que defina o parâmetro em nível de conta para aplicar esse método de resolução como padrão.
Embora você possa anular esse parâmetro em nível de sessão, não encorajamos alterar o parâmetro padrão, a menos que você tenha uma necessidade explícita de fazer isso.
Os exemplos a seguir ilustram o comportamento após alterar o parâmetro de FALSE para 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"
Além disso, se os identificadores para duas tabelas só tiverem como diferença letras maiúsculas e minúsculas, um identificador pode ser resolvido para uma tabela diferente após a alteração do parâmetro:
-- 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"