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).

Como a precisão é o número total de dígitos permitidos, você não pode carregar um valor em uma coluna NUMBER se o número de dígitos à esquerda do ponto decimal exceder a precisão da coluna menos sua escala. Por exemplo, NUMBER(20, 2) permite 18 dígitos no lado esquerdo da vírgula decimal e dois dígitos no lado direito da vírgula decimal, em um total de 20.

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;
Copy
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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

'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

No Snowflake, 'NaN' é maior . do que qualquer outro valor FLOAT, . incluindo infinito.

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.

It might be possible to avoid these types of approximation errors by using the exact DECFLOAT data type.

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;
Copy
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| 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).

DECFLOAT

The decimal float (DECFLOAT) data type stores numbers exactly, with up to 38 significant digits of precision, and uses a dynamic base-10 exponent to represent very large or small values. The exponent range is from -16383 to 16384, allowing values roughly between -10^(16384) and 10^(16384). The DECFLOAT data type supports a variable scale so that the scale varies depending on the specific value being stored. In contrast to the FLOAT data type, which represents values as approximations, the DECFLOAT data type represents exact values in the specified precision.

The DECFLOAT data type doesn’t support the following special values that are supported by the FLOAT data type: 'NaN' (not a number), 'inf' (infinity), and '-inf' (negative infinity).

Use cases for the DECFLOAT data type

Use the DECFLOAT data type when you need exact decimal results and a wide, variable scale in the same column.

The DECFLOAT data type is appropriate for the following general use cases:

  • You are ingesting data, and the scale of incoming numeric values is unknown or highly variable.

  • You require exact numeric values; for example, ledgers, taxes, or compliance.

  • You are migrating from systems that rely on the IEEE 754-decimal representation or 128-bit decimals. These migrations might be blocked by the precision or range limitations of other Snowflake data types.

  • You want to avoid Number out of representable range errors when you sum, multiply, or divide high-precision numeric values.

For example, you can use the DECFLOAT data type for the following specific use cases:

  • You are ingesting heterogeneously-scaled data from Oracle DECIMAL or DB2 DECFLOAT columns.

  • You are performing financial modeling involving computations with scales of results that are hard to predict.

  • You are running scientific measurements that swing from nano units to astronomical units.

You can continue to use the NUMBER data type for fixed-scale numeric columns or the FLOAT data type for high-throughput analytics where imprecise results are acceptable.

Usage notes for the DECFLOAT data type

  • If an operation produces a result with more than 38 digits, the DECFLOAT value is rounded to 38-digit precision, with the least-significant digits rounded off according to the current rounding mode. Snowflake uses the half up rounding mode for DECFLOAT values.

  • When specifying a DECFLOAT value or casting to a DECFLOAT value, avoid using numeric literals in SQL. If you do this, the values are interpreted as NUMBER or FLOAT values before being cast to a DECFLOAT value, which can result in range errors or loss of exactness. Use either string literals — such as SELECT '<value>'::DECFLOAT — or the DECFLOAT literal — such as SELECT DECFLOAT '<value>'.

  • When operations mix DECFLOAT values and values of other numeric types, coercion prefers the DECFLOAT values. For example, when adding a value of NUMBER type and DECFLOAT type, the result is a DECFLOAT value.

  • Use of the DECFLOAT type might cause storage consumption to increase.

Drivers and driver versions that support the DECFLOAT data type

The following Snowflake drivers and driver versions support the DECFLOAT data type. You might need to update your drivers to the versions that support DECFLOAT:

Driver

Minimum supported version

Notes

Snowflake Connector for Python

3.14.1

pandas DataFrames don’t support the DECFLOAT type.

ODBC

3.12.0

JDBC

3.27.0

Go Snowflake Driver

1.17.0

Unsupported drivers treat DECFLOAT values as TEXT values. For some drivers, a driver parameter must be set to map the DECFLOAT type to a language-native type. For more information, see Drivers.

Limitations for the DECFLOAT data type

The following limitations apply to the DECFLOAT type:

  • DECFLOAT values can’t be stored in VARIANT, OBJECT, or ARRAY values. To cast a DECFLOAT value to a VARIANT value, you can first cast it to a VARCHAR value and then to a VARIANT value.

  • DECFLOAT values aren’t supported in the following types of tables:

    • Tables in external formats, such as Iceberg

    • Hybrid tables

  • The DECFLOAT data type isn’t supported in Snowflake Scripting stored procedures. However, it is supported in Snowflake Scripting user-defined functions (UDFs).

  • The DECFLOAT data type isn’t supported in stored procedures or UDFs written in a language other than SQL (such as Python or Java).

  • The DECFLOAT data type isn’t supported in Snowpark.

  • Snowsight has limited support for the DECFLOAT data type.

  • The following features don’t support the DECFLOAT data type:

  • The NUMBER and FLOAT types might provide better performance than the DECFLOAT type.

Examples for the DECFLOAT data type

The following examples use the DECFLOAT data type:

Show the differences between DECFLOAT and FLOAT

Create a table with a DECFLOAT column and a FLOAT column, and insert the same values for both types into the table:

CREATE OR REPLACE TABLE decfloat_sample (
  id INT,
  decfloat_val DECFLOAT,
  float_val FLOAT);

INSERT INTO decfloat_sample VALUES
  (
    1,
    DECFLOAT '123e7000',
    FLOAT '123e7000'
  ),
  (
    2,
    12345678901234567890123456789::DECFLOAT,
    12345678901234567890123456789::FLOAT
  ),
  (
    3,
    '-4.2e-5432'::DECFLOAT,
    '-4.2e-5432'::FLOAT
  ),
  (
    4,
    '1.00000000000000000000000000000000000014'::DECFLOAT,
    '1.00000000000000000000000000000000000014'::FLOAT
  ),
  (
    5,
    '1.00000000000000000000000000000000000015'::DECFLOAT,
    '1.00000000000000000000000000000000000015'::FLOAT
  );
Copy

The statement inserts DECFLOAT values in the following ways:

  • The first value is inserted by using the DECFLOAT literal.

  • The second value is inserted by casting an INTEGER value to a DECFLOAT value.

  • The last three values are inserted by casting a VARCHAR value to a DECFLOAT value.

Describe the table to show the types. The precision wasn’t specified in the table definition for either column, but the output shows that the DECFLOAT data type supports up to 38 significant digits of precision:

DESC TABLE decfloat_sample;
Copy
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name         | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| ID           | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| DECFLOAT_VAL | DECFLOAT(38) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| FLOAT_VAL    | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Query the table to show the differences in the values:

SELECT * FROM decfloat_sample;
Copy
+----+-----------------------------------------+------------------------+
| ID | DECFLOAT_VAL                            |              FLOAT_VAL |
|----+-----------------------------------------+------------------------|
|  1 | 1.23e7002                               | inf                    |
|  2 | 12345678901234567890123456789           |   1.23456789012346e+28 |
|  3 | -4.2e-5432                              |  -0                    |
|  4 | 1.0000000000000000000000000000000000001 |   1                    |
|  5 | 1.0000000000000000000000000000000000002 |   1                    |
+----+-----------------------------------------+------------------------+

The output shows the following differences:

  • The first row shows that the DECFLOAT type supports a wider range of values than the FLOAT type. The DECFLOAT value is very large (1.23e7002). The FLOAT value is inf, which means that the value is larger than any value that the FLOAT type can represent.

  • The second row shows that the DECFLOAT type retains the specified value exactly. The FLOAT value is an approximation that is stored in scientific notation.

  • The third row shows that the DECFLOAT type supports very small values (-4.2e-5432). The FLOAT value is approximated to -0.

  • The fourth and fifth rows show that the DECFLOAT type supports up to 38 digits of precision and uses rounding rules for values beyond the limit. The FLOAT value is approximated to 1 in both rows.

Use DECFLOAT values with aggregate functions

The following example uses DECFLOAT values with aggregate functions. First, create a table and insert DECFLOAT values:

CREATE OR REPLACE TABLE decfloat_agg_sample (decfloat_val DECFLOAT);

INSERT INTO decfloat_agg_sample VALUES
  (DECFLOAT '1e1000'),
  (DECFLOAT '-2.47e999'),
  (DECFLOAT '22e-75');
Copy

Query the table by using some aggregate functions:

SELECT SUM(decfloat_val),
       AVG(decfloat_val),
       MAX(decfloat_val),
       MIN(decfloat_val)
  FROM decfloat_agg_sample;
Copy
+-------------------+-------------------+-------------------+-------------------+
| SUM(DECFLOAT_VAL) | AVG(DECFLOAT_VAL) | MAX(DECFLOAT_VAL) | MIN(DECFLOAT_VAL) |
|-------------------+-------------------+-------------------+-------------------|
| 7.53e999          | 2.51e999          | 1e1000            | -2.47e999         |
+-------------------+-------------------+-------------------+-------------------+

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 (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