Tipos de dados de cadeia de caracteres e binários

Este tópico descreve os tipos de dados de cadeia de caracteres/texto, incluindo cadeias de caracteres binárias, compatíveis com o Snowflake, além dos formatos aceitos para constantes/literais de cadeia de caracteres.

Neste tópico:

Tipos de dados para cadeias de caracteres de texto

O Snowflake oferece suporte aos seguintes tipos de dados para cadeias de texto (ou seja, caracteres).

VARCHAR

VARCHAR contém caracteres Unicode UTF-8.

Nota

Observe que, em alguns sistemas fora do Snowflake, tipos de dados como CHAR e VARCHAR armazenam ASCII, enquanto tipos de dados como NCHAR e NVARCHAR armazenam Unicode.

No Snowflake, VARCHAR e todos os outros tipos de dados de cadeia de caracteres armazenam caracteres Unicode UTF-8. Não há diferença com relação ao tratamento Unicode entre os tipos de dados CHAR e NCHAR. Sinônimos como NCHAR são principalmente para compatibilidade de sintaxe ao portar comandos DDL para o Snowflake.

Quando você declara uma coluna do tipo VARCHAR, você pode especificar um parâmetro opcional (N), que é o número máximo de caracteres a armazenar. Por exemplo:

create table t1 (v varchar(16777216));
Copy

Se nenhum comprimento for especificado, o padrão é o comprimento máximo permitido (16.777.216).

Embora o comprimento máximo de um VARCHAR seja especificado em caracteres, um VARCHAR também é limitado a um número máximo de bytes (16.777.216 (16 MB)). O número máximo de caracteres Unicode que podem ser armazenados em uma coluna VARCHAR é mostrado abaixo:

Um byte

16.777.216.

Múltiplos bytes

Entre 8.388.608 (2 bytes por caractere) e 4.194.304 (4 bytes por caractere).

Por exemplo, se você declarar uma coluna como VARCHAR(16777216), a coluna pode conter um máximo de 8.388.608 de caracteres Unicode de 2 bytes, mesmo que você tenha especificado um comprimento máximo de 16777216.

Ao escolher o comprimento máximo para uma coluna VARCHAR, considere o seguinte:

  • Armazenamento: Uma coluna consome o armazenamento apenas para a quantidade de dados reais armazenados. Por exemplo, uma cadeia de 1 caractere em uma coluna VARCHAR(16777216) consome apenas um caractere.

  • Desempenho: Não há diferença de desempenho entre usar a instrução VARCHAR de comprimento total VARCHAR(16777216) e um comprimento menor.

    Observe que, em qualquer banco de dados relacional, as instruções SELECT em que uma cláusula WHERE se refere a colunas VARCHAR, ou a colunas de cadeia de caracteres, não são tão rápidas quanto as instruções SELECT filtradas usando uma condição de coluna numérica ou de data.

  • Ferramentas para trabalhar com dados: Algumas ferramentas BI/ETL definem o tamanho máximo dos dados VARCHAR no armazenamento ou na memória. Se você souber o tamanho máximo de uma coluna, você pode limitar o tamanho ao adicionar a coluna.

  • Agrupamento: Quando você especifica um agrupamento para uma coluna VARCHAR, o número de caracteres que são permitidos varia, dependendo do número de bytes que cada caractere recebe e da especificação de agrupamento da coluna.

    Ao comparar valores em uma coluna agrupada, o Snowflake segue o algoritmo de agrupamento Unicode (UCA, Unicode Collation Algorithm). Esse algoritmo afeta o número máximo de caracteres permitido. Atualmente, cerca de 1,5 milhões a 8 milhões de caracteres são permitidos em uma coluna VARCHAR que é definida com um tamanho máximo e uma especificação de agrupamento.

    Como exemplo, a tabela a seguir mostra como o número máximo de caracteres pode variar para uma coluna VARCHAR(16777216), dependendo do número de bytes por caractere e da especificação de agrupamento utilizada:

    Número de bytes por caractere

    Especificação de agrupamento

    Número máximo de caracteres permitidos (aproximado)

    1 byte

    en-ci ou en-ci-pi-ai

    Cerca de 7 milhões de caracteres

    1 byte

    en

    Cerca de 4 milhões de caracteres

    2 bytes

    en-ci-pi-ai

    Cerca de 8 milhões de caracteres

    2 bytes

    en-ci ou en-ci-pi

    Cerca de 2,7 milhões de caracteres

    2 bytes

    en

    Cerca de 1,5 milhão de caracteres

CHAR , CHARACTER , NCHAR

Sinônimo de VARCHAR, exceto que, se o comprimento não for especificado, CHAR(1) é o padrão.

Nota

O Snowflake atualmente se desvia da semântica comum de CHAR, de forma que as cadeias de caracteres mais curtas do que o comprimento máximo não recebem espaços no final.

STRING , TEXT , NVARCHAR , NVARCHAR2 , CHAR VARYING , NCHAR VARYING

Sinônimo de VARCHAR.

Exemplos de cadeias de caracteres nas colunas da tabela

CREATE OR REPLACE TABLE test_text(v VARCHAR,
                                  v50 VARCHAR(50),
                                  c CHAR,
                                  c10 CHAR(10),
                                  s STRING,
                                  s20 STRING(20),
                                  t TEXT,
                                  t30 TEXT(30)
                                  );

DESC TABLE test_text;

+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| V    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| V50  | VARCHAR(50)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C    | VARCHAR(1)        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| C10  | VARCHAR(10)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| S20  | VARCHAR(20)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T    | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| T30  | VARCHAR(30)       | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Tipos de dados para cadeias de caracteres binárias

O Snowflake oferece suporte aos seguintes tipos de dados para cadeias de caracteres binárias.

BINARY

O comprimento máximo é de 8 MB (8.388.608 bytes). Ao contrário do VARCHAR, o tipo de dados BINARY não tem noção dos caracteres Unicode, portanto, o comprimento é sempre medido em termos de bytes.

(Valores BINARY são limitados a 8 MB para que caibam dentro de 16 MB quando convertidos em cadeias de caracteres hexadecimais, por exemplo, via TO_CHAR(<binary_expression>, 'HEX')).

Se um comprimento não for especificado, o padrão é o comprimento máximo.

VARBINARY

VARBINARY é sinônimo de BINARY.

Representação interna

O tipo de dados BINARY contém uma sequência de bytes de 8 bits.

Quando o Snowflake exibe valores de dados BINARY, o Snowflake costuma representar cada byte como 2 caracteres hexadecimais. Por exemplo, a palavra “HELP” pode ser exibida como 48454C50, onde “48” é o equivalente hexadecimal da letra ASCII (Unicode) “H”, “45” é a representação hexadecimal da letra “E” etc.

Para obter mais informações sobre a entrada e exibição de dados BINARY, consulte: Binary Input and Output.

Exemplos binários nas colunas da tabela

CREATE OR REPLACE TABLE test_binary(b BINARY,
                                    b100 BINARY(100),
                                    vb VARBINARY
                                    );

DESC TABLE test_binary;

+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type            | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| B100 | BINARY(100)     | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| VB   | BINARY(8388608) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+-----------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Constantes de cadeias de caracteres

Constantes (também conhecidas como literais) referem-se a valores de dados fixos. No Snowflake, as constantes de cadeias de caracteres devem estar sempre posicionadas entre caracteres delimitadores. O Snowflake oferece suporte ao uso das seguintes opções para delimitar as constantes de cadeias de caracteres.

Constantes de cadeias de caracteres entre aspas simples

Uma constante de cadeia de caracteres pode ser disposta entre delimitadores de aspas simples (por exemplo, 'This is a string'). Para incluir um caractere de aspas simples dentro de uma constante de cadeia de caracteres, digite duas aspas simples adjacentes (por exemplo, '').

Por exemplo:

SELECT 'Today''s sales projections', '-''''-';

+------------------------------+----------+
| 'TODAY''S SALES PROJECTIONS' | '-''''-' |
|------------------------------+----------|
| Today's sales projections    | -''-     |
+------------------------------+----------+
Copy

Nota

Duas aspas simples não são o mesmo que o caractere de aspas duplas ("), que é usado (se necessário) para delimitar os identificadores de objetos. Para obter mais informações, consulte Requisitos para identificadores.

Sequências de escape em constantes de cadeias de caracteres entre aspas simples

Para incluir aspas simples ou outros caracteres especiais (por exemplo, caractere de nova linha) em uma constante de cadeia de caracteres entre aspas simples, você deve aplicar o escape para estes caracteres usando sequências de escape de barra invertida. Uma sequência de escape de barra invertida é uma sequência de caracteres que começa com uma barra invertida (\).

Nota

Se a cadeia de caracteres tiver muitas aspas simples, barras invertidas ou outros caracteres especiais, você poderá usar uma constante de cadeia de caracteres entre cifrões para evitar usar o escape para estes caracteres.

Você também pode usar sequências de escape para inserir caracteres ASCII especificando seus pontos de código (os valores numéricos que correspondem a esses caracteres) em octal ou hexadecimal. Por exemplo, em ASCII, o ponto de código para o caractere de espaço é 32, que é 20 em hexadecimal. Para especificar um espaço, pode-se usar a sequência de escape hexadecimal \x20.

Você também pode usar sequências de escape para inserir caracteres Unicode, por exemplo \u26c4.

A tabela a seguir lista as sequências de escape compatíveis em quatro categorias: simples, octal, hexadecimal e Unicode:

Sequência de escape

Caractere representado

Sequências de escape simples

\'

Um caractere de aspas simples (')

\"

Uma caracteres de aspas duplas (")

\\

Um caractere de barra invertida (\)

\b

Um caractere de backspace

\f

Um caractere de formfeed

\n

Um caractere de nova linha (linefeed)

\r

Um caractere de carriage return

\t

Um caractere de tab

\0

Um caractere ASCII NUL

Sequências de escape octal

\ooo

Caractere ASCII em notação octal (ou seja, onde cada o representa um dígito octal).

Sequências de escape hexadecimal

\xhh

Caractere ASCII em notação hexadecimal (ou seja, onde cada h representa um dígito hexadecimal).

Sequências de escape Unicode

\uhhhh

Caractere Unicode em notação hexadecimal (ou seja, onde cada h representa um dígito hexadecimal). O número de dígitos hexadecimais deve ser exatamente 4.

Como mostrado na tabela acima, se uma constante de cadeia de caracteres precisa incluir um caractere de barra invertida (por exemplo, C:\ em um caminho do Windows ou \d em uma expressão regular), você deve aplicar o escape para a barra invertida com uma segunda barra invertida. Por exemplo, para incluir \d em uma expressão regular em uma constante de cadeia de caracteres, você deve usar \\d.

Observe que se uma barra invertida for usada em sequências diferentes das listadas acima, a barra invertida é ignorada. Por exemplo, a sequência de caracteres '\z' é interpretada como 'z'.

O exemplo a seguir demonstra como utilizar as sequências de escape com barra invertida. Isso inclui exemplos de especificação:

  • um caractere de tab

  • um caractere de nova linha

  • uma barra invertida

  • as sequências de escape octal e hexadecimal para um ponto de exclamação (ponto de código 33, que é \041 em octal e \x21 em hexadecimal)

  • a sequência de escape Unicode para uma pequena imagem de um boneco de neve

  • algo que não é uma sequência de escape válida

    SELECT $1, $2 FROM
    VALUES
    ('Tab','Hello\tWorld'),
    ('Newline','Hello\nWorld'),
    ('Backslash','C:\\user'),
    ('Octal','-\041-'),
    ('Hexadecimal','-\x21-'),
    ('Unicode','-\u26c4-'),
    ('Not an escape sequence', '\z')
    ;
    
    +------------------------+---------------+
    | $1                     | $2            |
    |------------------------+---------------|
    | Tab                    | Hello   World |
    | Newline                | Hello         |
    |                        | World         |
    | Backslash              | C:\user       |
    | Octal                  | -!-           |
    | Hexadecimal            | -!-           |
    | Unicode                | -⛄-          |
    | Not an escape sequence | z             |
    +------------------------+---------------+
    
    Copy

Constantes de cadeias de caracteres entre cifrões

Em alguns casos, talvez seja necessário especificar uma constante de cadeia de caracteres que contém:

  • Caracteres de aspas simples.

  • Caracteres de barra invertida (por exemplo, em uma expressão regular).

  • Caracteres de nova linha (por exemplo, no corpo de um procedimento armazenado ou função que você especifica em CREATE PROCEDURE ou CREATE FUNCTION).

Nestes casos, você pode evitar o escape desses caracteres usando um par de cifrões ($$) em vez de aspas simples (') para delimitar o início e o fim da cadeia de caracteres.

Em uma constante de cadeia de caracteres entre cifrões, você pode incluir aspas, barras invertidas, caracteres de nova linha e qualquer outro caractere especial (exceto cifrões duplos) sem usar o escape para esses caracteres. O conteúdo de uma constante de cadeia de caracteres entre cifrões é sempre interpretado literalmente.

Os exemplos a seguir são formas equivalentes de especificar constantes de cadeias de caracteres:

Exemplo de uso de delimitadores com aspas simples

Exemplo de uso de delimitadores com cifrões duplos

'string with a \' character'
Copy
$$string with a ' character$$
Copy
'regular expression with \\ characters: \\d{2}-\\d{3}-\\d{4}'
Copy
$$regular expression with \ characters: \d{2}-\d{3}-\d{4}$$
Copy
'string with a newline\\ncharacter'
Copy
$$string with a newline
character$$
Copy

O exemplo a seguir usa uma constante de cadeia de caracteres entre cifrões que contém caracteres de nova linha e várias sequências de escape.

SELECT $1, $2 FROM VALUES ('row1', $$a
                                      ' \ \t
                                      \x21 z $ $$);

+------+-------------------------------------------------------+
| $1   | $2                                                    |
|------+-------------------------------------------------------|
| row1 | a                                                     |
|      |                                           ' \ \t      |
|      |                                           \x21 z $    |
+------+-------------------------------------------------------+
Copy

Nesse exemplo, observe como as sequências de escape são interpretadas como caracteres individuais (por exemplo, uma barra invertida seguida de um “t”), e não como sequências de escape.