1. 정수형(Numeric Data – INT 계열)
MySQL에서 숫자를 정수로 다룰 때 사용되는 자료형은 다음과 같이 크게 5가지가 있습니다.
| Type | Storage (Bytes) | Minimum Value (Signed) | Maximum Value (Signed) |
|---|
| TINYINT | 1 | -128 | 127 |
| SMALLINT | 2 | -32768 | 32767 |
| MEDIUMINT | 3 | -8,388,608 | 8,388,607 |
| INT | 4 | -2,147,483,648 | 2,147,483,647 |
| BIGINT | 8 | -2^63 | 2^63 - 1 |
1) SIGNED vs. UNSIGNED
- SIGNED: 음수와 양수를 모두 저장 가능. (예:
128 ~ 127 for TINYINT)
- UNSIGNED: 음수를 제외하고 양수만 저장 가능. 대신 최대 양의 범위가 SIGNED보다 2배가량 늘어납니다. (예:
0 ~ 255 for TINYINT)
2) 각 자료형 선택 시 고려사항
- 범위: 저장할 데이터의 최대/최소값을 미리 고려해서, 필요한 범위를 커버하는 최소 자료형을 고르는 것이 좋습니다(메모리 사용, 성능 최적화 차원).
- 성능: 보통 자료형이 작을수록(바이트가 작을수록) 인덱스 효율성이 향상될 수 있습니다. 다만, 실제로는 DB 설계 및 하드웨어, 인덱스 구조에 따라 차이가 있으므로 범위와 성능을 균형 있게 고려합니다.
- 예를 들어, 나이, 카운트(수량)가 0
255 정도로 충분하면 TINYINT UNSIGNED를 쓸 수도 있습니다. 부서 번호, 직책 번호 등이 065535 범위면 SMALLINT UNSIGNED 등이 가능합니다.
2. 실수형(Numeric Data – Float 계열)
MySQL에서 실수(부동소수점, 고정소수점)를 다룰 때 주로 사용되는 자료형은 다음과 같습니다.
| Type | Storage (Bytes) | 연산속도 | 소수점 타입 |
|---|
| FLOAT | 4 | 하 | 부동소수점 |
| DOUBLE | 8 | 중 | 부동소수점 |
| DECIMAL | 16 | 상 | 고정소수점 |
1) FLOAT vs. DOUBLE
- FLOAT(4바이트)는 비교적 적은 메모리를 사용하며, 소수점 정밀도가 DOUBLE보다 낮습니다.
- DOUBLE(8바이트)는 FLOAT보다 2배 메모리를 사용하지만, 좀 더 높은 정밀도를 제공합니다.
- 둘 다 부동소수점(Approximate Numeric)으로, 매우 큰 수나 매우 작은 수를 표현하기에 유리하지만 오차가 발생할 수 있습니다(IEEE 754 표준의 특성).
2) DECIMAL (고정소수점, Fixed-Point)
- DECIMAL은 숫자 전체 자릿수(precision)와 소수점 이하 자릿수(scale)를 명시적으로 지정하여 정밀도(Accuracy)를 유지하는 자료형입니다.
- 금융, 회계와 같이 소수점 이하 정밀도가 매우 중요한 경우(오차 허용 불가) 주로 사용합니다.
- 내부적으로 문자열 기반으로 처리되어 FLOAT/DOUBLE에 비해 연산 속도가 떨어질 수 있지만, 오차가 없는 정확한 연산이 가능합니다.
3. 자료형 선택 팁
- 정수형:
- 다루려는 데이터 범위를 먼저 파악해 가장 작은 범위로 커버할 수 있는 자료형을 선택
- 음수가 필요한지(마이너스 값이 발생하는지) 고려 -> UNSIGNED 사용 가능성 체크
- 실수형:
- 오차 허용 범위를 먼저 확인
- 일반적으로 과학적 계산(예: 센서 데이터, 로그 값)처럼 거대 범위 표현 & 일부 오차 허용 시 FLOAT/DOUBLE
- 금전, 결제 등 극도로 정확한 계산이 필요하면 DECIMAL
- 정밀도와 메모리 사용, 연산 속도 사이의 트레이드오프를 고려해야 함
- 범위/정밀도 vs. 성능
- 더 큰 자료형일수록 저장공간과 인덱싱 시 부담이 늘어날 수 있습니다.
- 너무 작아 범위를 초과하는 경우 오류나 데이터 손실이 발생할 수 있으니 유의해야 합니다.
4. 예시: 테이블 컬럼 설계
예를 들어, 임의의 주문 테이블(orders)를 구성할 때 다음과 같은 고민 과정을 거칠 수 있습니다:
sql
코드 복사
CREATE TABLE orders (
order_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
customer_id MEDIUMINT UNSIGNED NOT NULL,
product_id INT UNSIGNED NOT NULL,
order_qty SMALLINT UNSIGNED NOT NULL,
order_price DECIMAL(10,2) NOT NULL,
discount_rate FLOAT DEFAULT 0,
order_date DATETIME NOT NULL
);
order_id: 전체 데이터가 수천만 건 이상 될 수 있다고 가정, INT UNSIGNED(4바이트, 최대 42억여 건)면 충분하다고 판단.
customer_id: 고객 ID는 수백만 정도 가능하므로, MEDIUMINT UNSIGNED(약 1천6백만) 정도로 커버 가능.
order_qty: 상품 주문량(주로 수백 ~ 수천) 정도면 SMALLINT UNSIGNED(최대 65535)로 충분.
order_price: 금액이므로 오차 없는 연산이 필요. 소수 둘째 자리까지 표현해야 하므로 DECIMAL(10,2) 사용.
discount_rate: 할인율 등은 정밀도 큰 오차가 발생해도 큰 문제가 없으므로, FLOAT로 처리(일부 오차 감수).
5. 마무리
- 정수형(
TINYINT ~ BIGINT)과 실수형(FLOAT, DOUBLE, DECIMAL) 중 어떤 자료형을 선택하느냐는 데이터 특성과 사용 목적에 달려 있습니다.
- 데이터 범위와 정밀도, 성능(메모리, 연산속도), 오차 허용 여부 등을 종합적으로 고려해 적절한 자료형을 선택해야 합니다.
- 특히 금융/회계 데이터나 재고 수량 같은 중요한 정보는 정밀도 보장을 위해 DECIMAL(또는 정수형으로 소수 부분을 따로 처리) 방식을 권장합니다.
- 일반적인 수치 계산, 로그, 센서 데이터 수집 등에서는 FLOAT/DOUBLE이 더 나은 성능을 낼 수 있습니다.