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.
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)). A precisão limita o intervalo de valores que podem ser inseridos em (ou convertidos em) colunas de um determinado tipo. Por exemplo, o valor 999
se encaixa 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. Os números com menos de 38 dígitos significativos, mas cuja menor casa decimal está além da 37ª posição, como 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 e, em seguida, voltarem ao tipo de dados de maior precisão, os dados poderão perder a precisão. Por exemplo, a precisão é perdida se você converter um valor NUMBER(38,37) em um valor DOUBLE (que tem uma precisão de aproximadamente 15 dígitos decimais) e, em seguida, voltar 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 pelo fato de que a precisão e a escala não podem ser especificadas (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, BYTEINT, e assim por diante) servem para simplificar a portabilidade de outros sistemas e sugerir o intervalo esperado de valores 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. Os requisitos de armazenamento para o mesmo número em colunas com diferentes precisões, 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).
Entretanto, a escala (o número de dígitos após o ponto decimal) afeta 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, o processamento de valores com uma escala maior pode ser um pouco mais lento 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¶
A instrução a seguir cria uma tabela com colunas de vários tipos de dados de ponto fixo:
CREATE OR REPLACE TABLE test_fixed(
num0 NUMBER,
num10 NUMBER(10,1),
dec20 DECIMAL(20,2),
numeric30 NUMERIC(30,3),
int1 INT,
int2 INTEGER);
DESC TABLE test_fixed;
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| NUM0 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| NUM10 | NUMBER(10,1) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| DEC20 | NUMBER(20,2) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| NUMERIC30 | NUMBER(30,3) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| INT1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| INT2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
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 são para fins de 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. (O Snowflake pode representar valores mais extremos entre aproximadamente 10-324 e 10-308 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 é um 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 |
---|---|---|---|
|
|
|
No Snowflake, os valores |
|
|
|
No Snowflake, |
Erros de arredondamento¶
As operações de ponto flutuante podem apresentar 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 geoespaciais.
A seguir, considerações sobre erros de arredondamento:
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 as funções de agregação (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.
Os 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) 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¶
A instrução a seguir cria uma tabela com colunas de vários tipos de dados de ponto flutuante:
CREATE OR REPLACE TABLE test_float(
double1 DOUBLE,
float1 FLOAT,
dp1 DOUBLE PRECISION,
real1 REAL);
DESC TABLE test_float;
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| DOUBLE1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| FLOAT1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| DP1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
| REAL1 | FLOAT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL | NULL |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
Nota
A coluna type
do comando DESC TABLE exibe o tipo de dados FLOAT não apenas para FLOAT, mas também para sinônimos de FLOAT (por exemplo, DOUBLE, DOUBLE PRECISION e REAL).
Constantes numéricas¶
O termo constantes (também conhecido como literais) refere-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
(ouE
) 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