1. 정수 타입 (Integer Types)
MySQL은 저장 공간과 수의 범위를 효율적으로 관리하기 위해 다양한 정수 타입을 제공합니다. 각 타입은 부호가 있는(SIGNED) 상태와 부호가 없는(UNSIGNED) 상태로 선언할 수 있습니다.
| 타입 | 바이트(Bit) | SIGNED 범위 | UNSIGNED 범위 |
|---|---|---|---|
| TINYINT | 1 (8) | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 (16) | -32,768 ~ 32,767 | 0 ~ 65,535 |
| MEDIUMINT | 3 (24) | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
| INT | 4 (32) | 약 -21억 ~ 21억 | 0 ~ 약 42억 |
| BIGINT | 8 (64) | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
- SIGNED (기본값): 가장 왼쪽 비트를 부호 비트로 사용하여 음수와 양수를 모두 표현합니다.
- UNSIGNED: 모든 비트를 수치 표현에 사용하여 양수의 범위를 두 배로 늘립니다.
2. 부동 소수점과 고정 소수점
실수를 저장할 때는 정밀도 요구 사항에 따라 부동 소수점(Floating-point)이나 고정 소수점(Fixed-point) 타입을 선택해야 합니다.
| 타입 | 바이트 | 특징 |
|---|---|---|
| FLOAT | 4 | 단정밀도 부동 소수점 (약 7자리 정밀도) |
| DOUBLE | 8 | 배정밀도 부동 소수점 (약 15~16자리 정밀도) |
| DECIMAL(M, D) | 가변 | 고정 소수점. 금액 등 정확한 계산이 필요한 경우 사용 |
DECIMAL(M, D)에서 M은 전체 자릿수(Precision)를, D는 소수점 이하 자릿수(Scale)를 의미합니다. 내부적으로 문자열 방식으로 저장되어 이진수 변환 오차가 발생하지 않습니다.
3. 날짜 및 시간 타입
날짜와 시간을 다루는 타입은 용도에 따라 형식이 구분됩니다.
| 타입 | 형식 | 범위 | 용도 |
|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 날짜 정보만 저장 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 시간 또는 시간 간격 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 ~ 9999-12-31 | 날짜와 시간 (타임존 독립적) |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 ~ 2038-01-19 | 타임존에 종속적인 시간 정보 |
주요 시간 함수 및 연산
-- 현재 날짜 및 시간 조회
SELECT CURDATE(); -- 2024-05-20
SELECT NOW(); -- 2024-05-20 14:30:00
-- 날짜 더하기 및 빼기
SELECT DATE_ADD(NOW(), INTERVAL 10 DAY); -- 10일 후
SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH); -- 3개월 전
-- 포맷 변환
SELECT DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %H시 %i분');
자동 시간 업데이트 설정
데이터의 생성 시간과 수정 시간을 자동으로 관리하려면 DEFAULT와 ON UPDATE 제약 조건을 활용합니다.
CREATE TABLE user_logs (
log_id INT AUTO_INCREMENT PRIMARY KEY,
action_name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
4. 문자열 타입
문자열 데이터는 길의의 가변 여부에 따라 CHAR와 VARCHAR로 나뉩니다.
- CHAR(n): 고정 길이. 지정된 길이보다 짧은 문자열이 들어오면 공백을 채워 저장합니다. 읽기 속도가 빠릅니다.
- VARCHAR(n): 가변 길이. 실제 데이터의 길이에 맞춰 저장 공간을 사용합니다. 공간 효율성이 좋습니다.
| 특성 | CHAR | VARCHAR |
|---|---|---|
| 저장 방식 | 고정 크기 | 데이터 길이 + 길이 정보(1~2바이트) |
| 공간 효율 | 낮음 | 높음 |
| 성능 | 빠름 (정적 메모리 할당) | 상대적으로 느림 |
5. 데이터 범위 초과 및 오버플로 처리
데이터 타입이 허용하는 임계치를 벗어날 경우 MySQL의 설정(SQL Mode)에 따라 동작이 달라집니다.
- 범위 초과 (Out of Range): 입력값이 데이터 타입의 최소/최대 범위를 벗어난 경우입니다.
- Strict Mode인 경우: 오류가 발생하며 쿼리가 실패합니다.
- Non-strict Mode인 경우: 가장 가까운 경계값으로 잘려서 저장되고 경고(Warning)가 발생합니다.
- 오버플로 (Overflow): 연산 과정에서 결과값이 타입의 표현 용량을 초과하는 경우입니다.
-- 예시: TINYINT UNSIGNED(최대 255)에 연산 수행
-- 결과가 255를 넘으면 SQL 모드에 따라 에러 또는 최대값으로 처리됨
SELECT CAST(200 AS UNSIGNED) + CAST(100 AS UNSIGNED);