Number
숫자 데이터 타입은 값의 정확한 저장 여부와 값을 저장하는 내부 형식에 따라 나눌 수 있다.
- 참값 타입: 값을 변형 없이 그대로 저장하는 타입(
INTEGER,DECIMAL) - 근삿값 타입: 부동 소수점 방식으로 값을 저장하며, 이 과정에서 미세한 오차가 발생할 수 있는 타입(
FLOAT,DOUBLE) - 이진 표기법: CPU가 가장 효율적으로 처리할 수 있는 이진수 형태로 값을 저장하는 타입, 저장 공간 효율이 좋음(대부분의 숫자 타입,
INTEGER계열,FLOAT,DOUBLE) - 십진 표기법: 각 자릿수를 개별적으로 표현하여 저장하는 타입, 이진 표기법보다 더 많은 저장 공간을 사용하지만 오차 발생 X(
DECIMAL타입 유일)
DECIMAL 타입을 제외하고 정수를 저장하는 타입은 5가지가 존재하며, 각 타입별 범위는 아래와 같다.
| 데이터 타입 | 저장공간(Bytes) | 최솟값(Signed) | 최솟값(Unsigned) | 최댓값(Signed) | 최댓값(Unsigned) |
|---|---|---|---|---|---|
| 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 옵션 사용은 인덱스의 사용 여부에 영향을 끼치진 않지만, 범위가 다르기 때문에 조인 시엔 각 타입별로 동일한 타입을 사용하는 것이 좋다.
부동 소수점
Section titled “부동 소수점”FLOAT와 DOUBLE 타입은 실수를 근사치로 표현한다.
- IEEE 754 표준에 따라 이진 부동 소수점 방식으로 값을 저장
- 일부 십진 소수를 정확하게 표현하지 못하는 한계를 가짐
- 십진수 0.1 -> 이진수로 표현 불가능하여 가장 가까운 값으로 저장
이러한 특성 때문에 부동 소수점 타입의 컬럼을 동등 비교(=) 조건으로 사용하는 것은 잠재적인 버그를 유발할 수 있다.
DECIMAL
Section titled “DECIMAL”DECIMAL 타입은 고정 소수점 타입으로, 숫자를 내부적으로 문자열이나 이진 형태의 십진 표기법으로 저장하여 소수점 아래 자릿수까지 정확하게 표현한다.
- 자릿수만큼 고정된 크기로 저장하기 때문에 메모리나 디스크 공간을 많이 사용
DECIMAL(P, S)와 같이 선언하며,P(Precision)는 소수점을 포함한 전체 유효 숫자의 자릿수를,S(Scale)는 소수점 이하의 자릿수를 의미
소수점에서 정확한 값을 보장할 수 있지만, 저장 공간과 연산 속도 측면에서 트레이드오프가 존재한다.
- 저장 공간: 이진 표기법을 사용하는 다른 숫자 타입보다 더 많은 저장 공간 요구
- 연산 속도: CPU가 직접 처리하는 이진 연산에 비해 소프트웨어적으로 처리되므로 상대적으로 느림
따라서 모든 숫자 타입에 DECIMAL을 사용하는 것은 비효율적이며, 오차 없는 소수점 연산이 반드시 필요한 경우에만 DECIMAL을 선택하는 것이 좋다.