숫자 데이터 타입

This topic describes the numeric data types supported in Snowflake, along with the supported formats for numeric constants and literals.

고정 소수점 숫자의 데이터 타입

Snowflake는 고정 소수점 숫자에 대해 다음 데이터 타입을 지원합니다.

NUMBER

최대 38자리 숫자로, 다음과 같은 선택적 전체 자릿수와 소수 자릿수를 갖습니다.

전체 자릿수:

허용되는 총 자릿수입니다.

소수 자릿수:

소수점 오른쪽에 허용되는 자릿수입니다.

By default, precision is 38, and scale is 0; that is, NUMBER(38, 0). Precision limits the range of values that can be inserted into or cast to columns of a given type. For example, the value 999 fits into NUMBER(38,0) but not into NUMBER(2,0).

Because precision is the total number of digits allowed, you can’t load a value into a NUMBER column if the number of digits to the left of the decimal point exceeds the precision of the column minus its scale. For example, NUMBER(20, 2) allows 18 digits on the left side of the decimal point and two digits on the right side of the decimal point, for a total of 20 digits.

The maximum scale, which is the number of digits to the right of the decimal point, is 37. Numbers that have fewer than 38 significant digits, but whose least significant digit is past the 37th decimal place — for example, 0.0000000000000000000000000000000000000012 (1.2e-39) — can’t be represented without losing some digits of precision.

참고

If data is converted to another data type with lower precision, and then converted back to the higher-precision data type, the data can lose precision. For example, precision is lost if you convert a NUMBER(38,37) value to a DOUBLE value — which has a precision of approximately 15 decimal digits — and then back to NUMBER.

Snowflake는 FLOAT 데이터 타입도 지원하므로, 전체 자릿수는 줄어도 더 넓은 범위의 값을 허용합니다.

DECIMAL , DEC , NUMERIC

NUMBER와 동의어입니다.

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

NUMBER 와 동일하지만 정밀도와 배율을 지정할 수 없다는 점을 예외로 합니다(즉, 항상 NUMBER(38, 0)으로 기본값이 지정됨). 따라서 모든 INTEGER 데이터 타입의 경우 값 범위는 -99999999999999999999999999999999999999에서 +99999999999999999999999999999999999999(포함)까지의 모든 정수 값입니다.

The various names — for example, TINYINT, BYTEINT, and so on —are to simplify porting from other systems and to suggest the expected range of values for a column of the specified type.

전체 자릿수와 소수 자릿수가 저장소 크기에 미치는 영향

Precision — the total number of digits — doesn’t affect storage. The storage requirements for the same number in columns with different precisions, such as NUMBER(2,0) and NUMBER(38,0), are the same. For each micro-partition, Snowflake determines the minimum and maximum values for a given column and uses that information to determine the storage size for all values for that column in the partition. For example:

  • If a column contains only values between -128 and +127, each of the values consumes 1 byte (uncompressed).

  • If the largest value in the column is 10000000, each of the values consumes 4 bytes (uncompressed).

However, scale — the number of digits following the decimal point — affects storage. For example, the same value stored in a column of type NUMBER(10,5) consumes more space than NUMBER(5,0). Also, processing values with a larger scale might be slightly slower and consume more memory.

공간을 절약하기 위해, Snowflake는 값을 압축한 후에 저장소에 기록합니다. 압축량은 데이터 값과 기타 요인에 따라 다릅니다.

테이블에 있는 고정 소수점 데이터 타입의 예

다음 문은 다양한 고정 소수점 데이터 타입의 열이 있는 테이블을 생성합니다.

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

부동 소수점 숫자의 데이터 타입

Snowflake는 부동 소수점 숫자에 대해 다음 데이터 타입을 지원합니다.

FLOAT , FLOAT4 , FLOAT8

FLOAT, FLOAT4, FLOAT8 은 다른 시스템과의 호환성을 위한 이름입니다. Snowflake는 이 세 가지를 모두 64비트 부동소수점 숫자로 취급합니다.

전체 자릿수

Snowflake는 배정밀도(64비트) IEEE 754 부동 소수점 숫자를 사용합니다.

Precision is approximately 15 digits. For example, for integers, the range is from -9007199254740991 to +9007199254740991 (-253 + 1 to +253 - 1). Floating-point values can range from approximately 10-308 to 10+308. Snowflake can represent more extreme values between approximately 10-324 and 10-308 with less precision. For more details, see the Wikipedia article on double-precision numbers.

Snowflake는 고정 소수점 데이터 타입 NUMBER 를 지원하므로, 지수 범위가 더 작아도 더 큰 전체 자릿수를 허용합니다.

특수한 값

Snowflake는 FLOAT에 대해 다음과 같은 특수한 값을 지원합니다.

  • 'NaN' (숫자가 아님).

  • 'inf' (무한대).

  • '-inf' (음의 무한대).

'NaN', 'inf', '-inf' 기호는 작은따옴표로 묶어야 하며 대/소문자를 구분하지 않습니다.

'NaN' 에 대한 비교 의미 체계는 다음과 같은 식으로 IEEE 754 표준과는 다릅니다.

조건

Snowflake

IEEE 754

설명

'NaN' = 'NaN'

TRUE

FALSE

Snowflake에서는 'NaN' 값이 모두 같습니다.

'NaN' > X . where X is any FLOAT value, including . infinity, other than NaN itself.

TRUE

FALSE

Snowflake에서 'NaN' 은 무한대를 포함한 다른 FLOAT 값(.)보다 . 큽니다.

반올림 오류

부동 소수점 연산자는 최하위 자릿수에서 작은 반올림 오류가 발생할 수 있습니다. 반올림 오류는 삼각함수, 통계 및 지리공간 함수를 포함한 모든 유형의 부동 소수점 처리에서 발생할 수 있습니다.

The following list shows considerations for rounding errors:

  • 오류는 쿼리가 실행될 때마다 다를 수 있습니다.

  • 피연산자의 정밀도 또는 소수 자릿수가 다른 경우 더 큰 오류가 발생할 수 있습니다.

  • Errors can accumulate, especially when aggregate functions —for example, SUM or AVG — process large numbers of rows. Casting to a fixed-point data type before aggregating can reduce or eliminate these errors.

  • Rounding errors can occur not only when working with SQL, but also when working with other code — for example, Java, JavaScript, or Python — that runs inside Snowflake — for example, in UDFs and stored procedures.

  • 두 개의 부동 소수점 숫자를 비교할 때 Snowflake는 정확히 같음이 아닌 대략적으로 같음을 사용하여 비교하는 것을 권장합니다.

정확한 DECFLOAT 데이터 타입을 사용하여 이러한 유형의 근사 오류를 방지할 수 있습니다.

DOUBLE , DOUBLE PRECISION , REAL

FLOAT와 동의어입니다.

테이블에 있는 부동 소수점 데이터 타입의 예

다음 문은 다양한 부동 소수점 데이터 타입의 열이 있는 테이블을 생성합니다.

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

참고

The DESC TABLE command’s type column displays the data type FLOAT not only for FLOAT, but also for synonyms of FLOAT; for example, DOUBLE, DOUBLE PRECISION, and REAL.

DECFLOAT

10진수 부동 소수점(DECFLOAT) 데이터 타입은 최대 38개의 유효한 전체 자릿수로 숫자를 정확히 저장하고 동적 10진수 지수를 사용하여 매우 크거나 작은 값을 나타냅니다. 지수 범위는 -16383~16384이며, 대략 -10^(16384) 및 10^(16384) 사이의 값을 허용합니다. DECFLOAT 데이터 타입은 가변 소수 자릿수를 지원하므로 소수 자릿수는 저장되는 특정 값에 따라 달라집니다. 근삿값으로 나타내는 FLOAT 데이터 타입과 달리, DECFLOAT 데이터 타입은 지정된 전체 자릿수의 정확한 값을 나타냅니다.

DECFLOAT 데이터 타입은 FLOAT 데이터 타입: 'NaN'`(숫자가 아님), :code:’inf’(무한대) :code:’-inf’`(음의 무한대)에 의해 지원되는 다음 :ref:`특수 값<label-data_type_float_special_values>`을 지원하지 않습니다.

DECFLOAT 데이터 타입의 사용 사례

동일한 열에 정확한 10진수 결과 및 넓은 가변 소수 자릿수가 필요한 경우 DECFLOAT 데이터 타입을 사용합니다.

DECFLOAT 데이터 타입은 다음과 같은 일반적인 사용 사례에 적합합니다.

  • 데이터를 수집 중이고 수신되는 숫자 값의 소수 자릿수를 알 수 없거나 매우 가변적입니다.

  • 정확한 숫자 값이 필요합니다(예: 원장, 세금 또는 규정 준수).

  • IEEE 754-10진수 표현 또는 128비트 10진수를 사용하는 시스템에서 마이그레이션하는 경우입니다. 이러한 마이그레이션은 다른 Snowflake 데이터 타입의 전체 자릿수 또는 범위 제한으로 인해 차단될 수 있습니다.

  • 높은 전체 자릿수 숫자 값을 더하거나 곱하거나 나눌 때 Number out of representable range 오류를 피하려는 경우입니다.

예를 들어, 다음과 같은 특정 사용 사례에 DECFLOAT 데이터 타입을 사용할 수 있습니다.

  • Oracle DECIMAL 또는 DB2 DECFLOAT 열에서 소수 자릿수가 제각각인 데이터를 수집하는 경우입니다.

  • 예측하기 어려운 결과의 소수 자릿수 계산이 포함된 재무 모델링을 수행하는 경우입니다.

  • 나노 단위에서 천문 단위로 변화하는 과학적 측정을 실행하는 경우입니다.

고정 소수 자릿수 숫자 열의 NUMBER 데이터 타입 또는 부정확한 결과가 허용되는 높은 처리량 분석을 위해 FLOAT 데이터 타입을 계속 사용할 수 있는 경우입니다.

DECFLOAT 데이터 타입에 대한 사용법 노트

  • 연산 결과가 38자리를 초과하는 결과를 생성하는 경우, DECFLOAT 값은 38자리 전체 자릿수로 반올림되며, 최하위 자릿수는 현재 반올림 모드에 따라 반올림됩니다. Snowflake는 DECFLOAT 값에 대해 `반올림 모드<https://en.wikipedia.org/wiki/Rounding#Rounding_half_up>`_를 사용합니다.

  • DECFLOAT 값을 지정하거나 DECFLOAT 값으로 캐스팅하는 경우, SQL에서 숫자 리터럴을 사용하지 마세요. SQL에서 숫자 리터럴을 사용하는 경우, 값은 DECFLOAT 값으로 캐스팅되기 전의 NUMBER 또는 FLOAT 값으로 해석되며, 이로 인해 범위 오류가 발생하거나 정확도가 떨어질 수 있습니다. 대신, SELECT'<value>'::DECFLOAT 등의 문자열 리터럴 또는 SELECT DECFLOAT'<value>' 등의 DECFLOAT 리터럴 중 하나를 사용합니다.

  • 연산에서 DECFLOAT 값 및 다른 숫자 유형의 값을 혼합하는 경우 강제 변환은 DECFLOAT 값을 선호합니다. 예를 들어, NUMBER 유형 및 DECFLOAT 유형의 값을 추가하는 경우 결과는 DECFLOAT 값입니다.

  • DECFLOAT 유형을 사용하면 저장소 사용량이 증가할 수 있습니다.

DECFLOAT 데이터 타입을 지원하는 드라이버 및 드라이버 버전

다음 Snowflake 드라이버 및 드라이버 버전은 DECFLOAT 데이터 타입을 지원합니다. DECFLOAT를 지원하는 버전으로 드라이버를 업데이트해야 할 수도 있습니다.

드라이버

최소 지원 버전

참고

Python용 Snowflake 커넥터

3.14.1

pandas DataFrames는 DECFLOAT 유형을 지원하지 않습니다.

ODBC

3.12.0

없습니다.

JDBC

3.27.0

없습니다.

Go Snowflake Driver

1.17.0

없습니다.

SQL API

2.0.0

없습니다.

지원되지 않는 드라이버는 DECFLOAT 값을 TEXT 값으로 처리합니다. 일부 드라이버의 경우, DECFLOAT 유형을 언어 네이티브 유형으로 매핑하기 위해 드라이버 매개 변수를 설정해야 합니다. 자세한 내용은 드라이버 섹션을 참조하십시오.

DECFLOAT 데이터 타입에 대한 제한 사항

DECFLOAT 유형에는 다음과 같은 제한 사항이 적용됩니다.

  • DECFLOAT 값은 VARIANT, OBJECT 또는 ARRAY 값에 저장할 수 없습니다. DECFLOAT 값을 VARIANT 값으로 캐스팅하려면 먼저 VARCHAR 값으로 캐스팅한 후 VARIANT 값으로 캐스팅하면 됩니다.

  • DECFLOAT 값은 다음 유형의 테이블에서 지원되지 않습니다.

    • Iceberg와 같은 외부 형식의 테이블

    • 하이브리드 테이블

  • DECFLOAT 데이터 타입은 Snowflake Scripting 저장 프로시저에서 지원되지 않습니다. 그러나 Snowflake Scripting 사용자 정의 함수(UDFs)에는 지원됩니다.

  • DECFLOAT 데이터 타입은 저장 프로시저 또는 Python, Java와 같이 SQL 이외의 언어로 작성된 UDFs에서는 지원되지 않습니다.

  • DECFLOAT 데이터 타입은 Snowflake에서 지원되지 않습니다.

  • Snowsight는 DECFLOAT 데이터 타입에 지원이 제한됩니다.

  • 다음 기능은 DECFLOAT 데이터 타입을 지원하지 않습니다.

  • NUMBER 및 FLOAT 유형은 DECFLOAT 유형보다 나은 성능을 제공할 수 있습니다.

Examples for the DECFLOAT data type

다음 예에서는 DECFLOAT 데이터 타입을 사용합니다.

DECFLOAT과 FLOAT의 차이점 표시

다음 예에서는 DECFLOAT 및 FLOAT 데이터 타입의 차이점을 보여줍니다.

  1. DECFLOAT 열 및 FLOAT 열이 있는 테이블을 만든 후 두 유형에 대해 동일한 값을 테이블에 삽입합니다.

    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

    해당 문은 다음과 같은 방법으로 DECFLOAT 값을 삽입합니다.

    • 첫 번째 값은 DECFLOAT 리터럴을 사용하여 삽입됩니다.

    • 두 번째 값은 INTEGER 값을 DECFLOAT 값에 캐스팅하여 삽입됩니다.

    • 세 번째, 네 번째, 다섯 번째 값은 VARCHAR 값을 DECFLOAT 값에 캐스팅하여 삽입됩니다.

  2. 유형을 표시하려면 DESC TABLE 명령을 사용하여 테이블을 설명합니다.

    두 열에 대한 테이블 정의에 전체 자릿수가 지정되지 않았지만, 출력에서 DECFLOAT 데이터 타입은 최대 38개의 유효한 전체 자릿수를 지원합니다.

    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           |
    +--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    
  3. 해당 값의 차이점을 표시하려면 SELECT 문을 사용하여 테이블을 쿼리합니다.

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

    출력은 다음과 같은 차이점을 보여줍니다.

    • 첫 번째 행에서 DECFLOAT 유형은 FLOAT 유형보다 더 넓은 범위의 값을 지원합니다. DECFLOAT 값은 매우 큽니다(1.23e7002). FLOAT 값은 ``inf``이므로 FLOAT 유형이 나타낼 수 있는 값보다 큽니다.

    • 두 번째 행에서 DECFLOAT 유형은 지정된 값을 정확히 유지합니다. FLOAT 값은 과학적 표기법으로 저장된 근삿값입니다.

    • 세 번째 행에서 DECFLOAT 유형은 매우 작은 값입니다(-4.2e-5432). FLOAT 값은 ``-0``으로 근사됩니다.

    • 네 번째 및 다섯 번째 행에서 DECFLOAT 유형은 최대 38자리의 전체 자릿수를 지원하며 제한을 초과하는 값에 대해서는 반올림 규칙을 사용합니다. FLOAT 값은 두 행 모두에서 ``1``로 근사됩니다.

집계 함수가 있는 DECFLOAT 값 사용하기

다음 예에서는 집계 함수가 있는 DECFLOAT 값을 사용합니다.

  1. 테이블을 만든 후 DECFLOAT 값을 테이블에 삽입합니다.

    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
  2. 일부 집계 함수를 사용하여 테이블을 쿼리합니다.

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

숫자 상수

The term constants — also known as literals — refers to fixed data values. The following formats are supported for numeric constants:

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

여기서:

  • + 또는 - 는 양수 또는 음수 값을 나타냅니다. 기본값은 양수입니다.

  • digits 는 0에서 9까지의 숫자 중 하나 이상의 숫자입니다.

  • e (또는 E)는 과학적 표기법의 지수를 나타냅니다. 지수 표시가 있는 경우 하나 이상의 숫자가 지수 표시 뒤에 와야 합니다.

다음 숫자는 지원되는 숫자 상수의 모든 예입니다.

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