Number
숫자 데이터 타입은 값의 정확한 저장 여부와 값을 저장하는 내부 형식에 따라 나눌 수 있다.
참값 타입: 값을 변형 없이 그대로 저장하는 타입(
INTEGER
,DECIMAL
)근삿값 타입: 부동 소수점 방식으로 값을 저장하며, 이 과정에서 미세한 오차가 발생할 수 있는 타입(
FLOAT
,DOUBLE
)이진 표기법: CPU가 가장 효율적으로 처리할 수 있는 이진수 형태로 값을 저장하는 타입, 저장 공간 효율이 좋음(대부분의 숫자 타입,
INTEGER
계열,FLOAT
,DOUBLE
)십진 표기법: 각 자릿수를 개별적으로 표현하여 저장하는 타입, 이진 표기법보다 더 많은 저장 공간을 사용하지만 오차 발생 X(
DECIMAL
타입 유일)
정수
DECIMAL 타입을 제외하고 정수를 저장하는 타입은 5가지가 존재하며, 각 타입별 범위는 아래와 같다.
TINYINT
1
-128
0
127
255
SMALLINT
2
-32,768
0
32,767
65,535
MEDIUMINT
3
-8,388,608
0
8,388,607
16,777,215
INT
4
-2,147,483,648
0
2,147,483,647
4,294,967,295
BIGINT
8
-9,223,372,036,854,775,808
0
9,223,372,036,854,775,807
18,446,744,073,709,551,615
UNSIGNED 옵션 사용은 인덱스의 사용 여부에 영향을 끼치진 않지만, 범위가 다르기 때문에 조인 시엔 각 타입별로 동일한 타입을 사용하는 것이 좋다.
부동 소수점
FLOAT
와 DOUBLE
타입은 실수를 근사치로 표현한다.
IEEE 754 표준에 따라 이진 부동 소수점 방식으로 값을 저장
일부 십진 소수를 정확하게 표현하지 못하는 한계를 가짐
십진수 0.1 -> 이진수로 표현 불가능하여 가장 가까운 값으로 저장
이러한 특성 때문에 부동 소수점 타입의 컬럼을 동등 비교(=
) 조건으로 사용하는 것은 잠재적인 버그를 유발할 수 있다.
DECIMAL
DECIMAL
타입은 고정 소수점 타입으로, 숫자를 내부적으로 문자열이나 이진 형태의 십진 표기법으로 저장하여 소수점 아래 자릿수까지 정확하게 표현한다.
자릿수만큼 고정된 크기로 저장하기 때문에 메모리나 디스크 공간을 많이 사용
DECIMAL(P, S)
와 같이 선언하며,P
(Precision)는 소수점을 포함한 전체 유효 숫자의 자릿수를,S
(Scale)는 소수점 이하의 자릿수를 의미
소수점에서 정확한 값을 보장할 수 있지만, 저장 공간과 연산 속도 측면에서 트레이드오프가 존재한다.
저장 공간: 이진 표기법을 사용하는 다른 숫자 타입보다 더 많은 저장 공간 요구
연산 속도: CPU가 직접 처리하는 이진 연산에 비해 소프트웨어적으로 처리되므로 상대적으로 느림
따라서 모든 숫자 타입에 DECIMAL
을 사용하는 것은 비효율적이며, 오차 없는 소수점 연산이 반드시 필요한 경우에만 DECIMAL
을 선택하는 것이 좋다.
참고자료
Last updated
Was this helpful?