숫자 데이터 타입

이 항목에서는 숫자 상수/리터럴에 대해 지원되는 형식과 함께, Snowflake에서 지원되는 숫자 데이터 타입에 대해 설명합니다.

이 항목의 내용:

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

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

NUMBER

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

전체 자릿수

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

소수 자릿수

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

기본적으로, 전체 자릿수는 38 이고 소수 자릿수는 0 (즉, NUMBER(38, 0))입니다. 전체 자릿수에 따라 특정 형식의 열에 삽입(또는 캐스트)할 수 있는 값의 범위가 제한됩니다. 예를 들어, 값 999NUMBER(38,0) 에 맞지만 NUMBER(2,0) 에는 맞지 않습니다.

최대 소수 자릿수(소수점 오른쪽의 자릿수)는 37입니다. 유효 숫자 자릿수가 38개 미만이지만 최하위 숫자가 37번째 소수자리를 지나는 숫자(예: 0.0000000000000000000000000000000000000012(1.2e-39))는 전체 자릿수 중 일부가 잘린 채로 표시할 수 있을 뿐입니다.

참고

데이터가 전체 자릿수가 낮은 또 다른 데이터 타입으로 변환된 다음 다시 더 높은 전체 자릿수 형식으로 변환되는 경우, 데이터의 전체 자릿수가 손실될 수 있습니다. 예를 들어, NUMBER(38,37) 값을 DOUBLE(전체 자릿수가 약 15자리임) 값으로 변환한 후 다시 NUMBER로 변환하면 전체 자릿수가 손실됩니다.

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

DECIMAL , DEC , NUMERIC

NUMBER와 동의어입니다.

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

전체 자릿수와 소수 자릿수를 지정할 수 없다는 점을 제외하고는, NUMBER와 동의어입니다(즉, 항상 기본값이 NUMBER(38, 0) 임). 따라서 모든 INTEGER 데이터 타입의 경우 값 범위는 -99999999999999999999999999999999999999에서 +99999999999999999999999999999999999999(포함)까지의 모든 정수 값입니다.

다양한 이름(TINYINT 등)은 다른 시스템에서의 포팅을 단순화하고 지정된 형식의 열에 대해 예상되는 값 범위를 시사하기 위한 것입니다.

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

전체 자릿수(총 자릿수)는 저장소에 영향을 미치지 않습니다. 다시 말해, NUMBER(2,0)NUMBER(38,0) 과 같이 전체 자릿수가 다른 열에 있는 같은 숫자에 대한 저장소 요구 사항이 똑같습니다. 각 마이크로 파티션에 대해, Snowflake는 주어진 열의 최소값과 최대값을 결정하고 해당 정보를 사용하여 파티션에 있는 해당 열의 모든 값에 적합한 저장소 크기를 결정합니다. 예:

  • 열에 -128 에서 +127 사이의 값만 있는 경우에는 각각의 값이 1바이트(압축되지 않음)를 사용합니다.

  • 열에서 가장 큰 값이 10000000 이면 각각의 값이 4바이트(압축되지 않음)를 사용합니다.

하지만 소수 자릿수(소수점 다음의 자릿수)는 저장소에 영향을 미칩니다. 예를 들어, NUMBER(10,5) 형식의 열에 저장된 똑같은 값이 NUMBER(5,0) 보다 많은 공간을 사용합니다. 또한, 더 큰 소수 자릿수를 가진 값을 처리하면 약간 더 느려지고 더 많은 메모리를 사용할 수 있습니다.

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

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

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

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

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

FLOAT , FLOAT4 , FLOAT8

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

전체 자릿수

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

전체 자릿수는 약 15자리입니다. 예를 들어, 정수의 범위는 -9007199254740991에서 -9007199254740991 ~ +9007199254740991(-253 + 1 to +253 - 1)입니다. 부동 소수점 값의 범위는 10-308 ~ 10+308 입니다. (대략 10-324 ~ 10-308 범위의 더 극단적인 값은 덜 정확하게 표시될 수 있습니다.) 자세한 내용은 배정밀도 숫자에 대한 Wikipedia 문서 를 참조하십시오.

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

특수 값

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

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

  • 'inf' (무한대).

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

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

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

조건

Snowflake

IEEE 754

설명

'NaN' = 'NaN'

TRUE

FALSE

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

'NaN' > X .. 여기서 X 는 (NaN 자신 이외의) . 무한대를 포함한 임의의 FLOAT 값입니다.

TRUE

FALSE

Snowflake는 'NaN' 을 무한대를 포함한 . 다른 모든 FLOAT 다른 값보다 . 큰 값으로 처리합니다.

반올림 오류

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

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

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

특히 집계 함수(예: SUM() or AVG())가 많은 수의 행을 처리할 때 오차가 누적될 수 있습니다. 집계하기 전에 고정 소수점 데이터 타입으로 캐스팅하면 이러한 오차를 줄이거나 없앨 수 있습니다.

반올림 오류는 SQL을 사용할 때는 물론이고, Snowflake 내부(예: UDF저장 프로시저)에서 실행되는 다른 코드(예: Java, JavaScript 또는 Python)를 사용할 때도 발생할 수 있습니다.

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

DOUBLE , DOUBLE PRECISION , REAL

FLOAT와 동의어입니다.

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

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

참고

DESCRIBE TABLE 명령의 《유형》 열에는 FLOAT뿐만 아니라 FLOAT의 동의어(예: DOUBLE, DOUBLE PRECISION, REAL)에 대해서도 데이터 타입이 《FLOAT》로 표시됩니다.

숫자 상수

상수 (리터럴 이라고도 함)는 고정 데이터 값을 가리킵니다. 숫자 상수에 대해 다음 형식이 지원됩니다.

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

여기서:

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

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

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

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

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