Tipos de dados numéricos

Este tópico descreve os tipos de dados numéricos compatíveis com o Snowflake, além dos formatos aceitos para constantes/literais numéricos.

Neste tópico:

Tipos de dados para números de ponto fixo

O Snowflake oferece suporte aos seguintes tipos de dados para números de ponto fixo.

NUMBER

Números até 38 dígitos, com precisão e escala opcionais:

Precisão

Número total de dígitos permitidos.

Escala

Número de dígitos permitidos à direita da vírgula decimal.

Por padrão, a precisão é 38 e a escala é 0 (ou seja, NUMBER(38, 0)). Observe que a precisão limita o intervalo de valores que podem ser inseridos (ou convertidos) em colunas de um determinado tipo. Por exemplo, o valor 999 cabe em NUMBER(38,0), mas não em NUMBER(2,0).

A escala máxima (número de dígitos à direita da vírgula decimal) é 37. Números que têm menos de 38 dígitos significativos, mas cujo dígito menos significativo está além da 37.ª posição decimal, por exemplo 0,0000000000000000000000000000000000000012 (1,2e-39), não podem ser representados sem perder alguns dígitos de precisão.

Nota

Se os dados forem convertidos em outro tipo de dados com menor precisão, então ao voltar à forma de maior precisão, os dados podem perder precisão. Por exemplo, você perde a precisão se converter um valor NUMBER(38,37) em DOUBLE (que tem uma precisão de aproximadamente 15 dígitos decimais), e depois de volta para NUMBER.

O Snowflake também oferece suporte ao tipo de dados FLOAT, o que permite uma gama mais ampla de valores, embora com menos precisão.

DECIMAL , DEC , NUMERIC

Sinônimo de NUMBER.

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

Sinônimo de NUMBER, exceto que não é possível especificar a precisão e a escala (ou seja, o padrão é sempre NUMBER(38, 0)). Portanto, para todos os tipos de dados INTEGER, o intervalo de valores abrange todos os valores inteiros a partir de -99999999999999999999999999999999999999 até +99999999999999999999999999999999999999 (inclusive).

Os vários nomes (TINYINT etc.) funcionam para simplificar a portabilidade de outros sistemas e sugerir o intervalo de valores esperado para uma coluna do tipo especificado.

Impacto da precisão e da escala no tamanho de armazenamento

A precisão (número total de dígitos) não afeta o armazenamento. Em outras palavras, os requisitos de armazenamento para o mesmo número em colunas com precisões diferentes, como NUMBER(2,0) e NUMBER(38,0), são os mesmos. Para cada micropartição, o Snowflake determina os valores mínimo e máximo para uma determinada coluna e usa essa informação para determinar o tamanho de armazenamento para todos os valores dessa coluna na partição. Por exemplo:

  • Se uma coluna contém apenas valores entre -128 e +127, então cada um dos valores consome 1 byte (não comprimido).

  • Se o maior valor na coluna for 10000000, então cada um dos valores consome 4 bytes (não comprimido).

No entanto, a escala (número de dígitos após a vírgula decimal) tem um impacto sobre o armazenamento. Por exemplo, o mesmo valor armazenado em uma coluna do tipo NUMBER(10,5) consome mais espaço do que NUMBER(5,0). Além disso, processar valores com uma escala maior poder ser um pouco mais demorado e consumir mais memória.

Para economizar espaço, o Snowflake comprime os valores antes de gravá-los no armazenamento. A quantidade de compressão depende dos valores dos dados e de outros fatores.

Exemplos de tipos de dados de ponto fixo em uma tabela

CREATE OR REPLACE TABLE test_fixed(num NUMBER,
                                    num10 NUMBER(10,1),
                                    dec DECIMAL(20,2),
                                    numeric NUMERIC(30,3),
                                    int INT,
                                    integer INTEGER
                                    );

DESC TABLE test_fixed;

+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name    | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| NUM     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| NUM10   | NUMBER(10,1) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| DEC     | NUMBER(20,2) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| NUMERIC | NUMBER(30,3) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| INT     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| INTEGER | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Tipos de dados para números de ponto flutuante

O Snowflake oferece suporte aos seguintes tipos de dados para números de ponto flutuante.

FLOAT , FLOAT4 , FLOAT8

Os nomes FLOAT, FLOAT4 e FLOAT8 funcionam para compatibilidade com outros sistemas; o Snowflake trata todos os três como números de ponto flutuante de 64 bits.

Precisão

O Snowflake utiliza números de ponto flutuante de precisão dupla (64 bits) IEEE 754.

A precisão é de aproximadamente 15 dígitos. Por exemplo, para números inteiros, o intervalo é de -9007199254740991 a +9007199254740991 (-253 + 1 a +253 - 1). Os valores de ponto flutuante podem variar de aproximadamente 10-308 a 10+308. (Valores mais extremos entre aproximadamente 10-324 e 10-308 podem ser representados com menos precisão). Para obter mais detalhes, consulte o artigo da Wikipédia sobre números de precisão dupla.

O Snowflake oferece suporte ao tipo de dados de ponto fixo NUMBER, que permite maior precisão, embora uma gama menor de expoentes.

Valores especiais

O Snowflake oferece suporte aos seguintes valores especiais para FLOAT:

  • 'NaN' (não número).

  • 'inf' (infinito).

  • '-inf' (infinito negativo).

Os símbolos 'NaN', 'inf' e '-inf' devem estar entre aspas simples e fazem a distinção entre maiúsculas e minúsculas.

A semântica comparativa para 'NaN' difere do padrão IEEE 754 das seguintes maneiras:

Condição

Snowflake

IEEE 754

Comentário

'NaN' = 'NaN'

TRUE

FALSE

No Snowflake, os valores 'NaN' são todos iguais.

'NaN' > X ., em que X é qualquer valor FLOAT, incluindo . infinito (diferente de NaN em si).

TRUE

FALSE

O Snowflake trata 'NaN' como superior . a qualquer outro valor FLOAT, . incluindo infinito.

Erros de arredondamento

As operações de ponto flutuante podem ter pequenos erros de arredondamento nos dígitos menos significativos. Erros de arredondamento podem ocorrer em qualquer tipo de processamento de ponto flutuante, incluindo funções trigonométricas, estatísticas e funções geoespaciais.

Os erros podem variar a cada vez que a consulta é executada.

Os erros podem ser maiores quando os operandos têm precisão ou escala diferente.

Os erros podem se acumular, especialmente quando funções agregadas (por exemplo, SUM() ou AVG()) processam um grande número de linhas. Converter em um tipo de dados de ponto fixo antes de agregar pode reduzir ou eliminar esses erros.

Erros de arredondamento podem ocorrer não apenas ao trabalhar com SQL, mas também ao trabalhar com outro código (por exemplo, Java, JavaScript ou Python) que é executado dentro do Snowflake (por exemplo, em UDFs e procedimentos armazenados).

Ao comparar dois números de ponto flutuante, o Snowflake recomenda a comparação para uma igualdade aproximada, em vez de uma igualdade exata.

DOUBLE , DOUBLE PRECISION , REAL

Sinônimo de FLOAT.

Exemplos de tipos de dados de ponto flutuante em uma tabela

CREATE OR REPLACE TABLE test_float(d DOUBLE,
                                   f FLOAT,
                                   dp DOUBLE PRECISION,
                                   r REAL
                                   );

DESC TABLE test_float;

+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name    | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| D       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| F       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| DP      | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| R       | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Nota

A coluna “type” do comando DESCRIBE TABLE exibe o tipo de dados “FLOAT” não somente para FLOAT, mas também para sinônimos de FLOAT (por exemplo, DOUBLE, DOUBLE PRECISION e REAL).

Constantes numéricas

Constantes (também conhecidas como literais) referem-se a valores de dados fixos. Os seguintes formatos são aceitos para constantes numéricas:

[+-][digits][.digits][e[+-]digits]

Onde:

  • + ou - indica um valor positivo ou negativo. O padrão é positivo.

  • digits é um ou mais dígitos de 0 a 9.

  • e (ou E) indica um expoente em notação científica. Pelo menos um dígito deve seguir o marcador do expoente, se presente.

Os números a seguir são exemplos de constantes numéricas aceitas:

15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1
Copy