숫자 데이터 타입¶
이 항목에서는 숫자 상수/리터럴에 대해 지원되는 형식과 함께, Snowflake에서 지원되는 숫자 데이터 타입에 대해 설명합니다.
이 항목의 내용:
고정 소수점 숫자의 데이터 타입¶
Snowflake는 고정 소수점 숫자에 대해 다음 데이터 타입을 지원합니다.
NUMBER¶
최대 38자리 숫자로, 다음과 같은 선택적 전체 자릿수와 소수 자릿수를 갖습니다.
- 전체 자릿수:
허용되는 총 자릿수입니다.
- 소수 자릿수:
소수점 오른쪽에 허용되는 자릿수입니다.
기본적으로, 전체 자릿수는 38
이고 소수 자릿수는 0
(즉, NUMBER(38, 0)
)입니다. 전체 자릿수에 따라 특정 형식의 열에 삽입(또는 캐스트)할 수 있는 값의 범위가 제한됩니다. 예를 들어, 값 999
는 NUMBER(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 |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
부동 소수점 숫자의 데이터 타입¶
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 |
설명 |
---|---|---|---|
|
|
|
Snowflake에서는 |
|
|
|
Snowflake는 |
반올림 오류¶
부동 소수점 연산에서는 최하위 자릿수에서 작은 반올림 오류가 있을 수 있습니다. 반올림 오류는 삼각 함수, 통계 및 지리 공간 함수 등 모든 타입의 부동 소수점 처리에서 발생할 수 있습니다.
오류는 쿼리가 실행될 때마다 다를 수 있습니다.
피연산자의 정밀도 또는 소수 자릿수가 다른 경우 더 큰 오류가 발생할 수 있습니다.
특히 집계 함수(예: 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 |
+---------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
참고
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