Database/Mysql
[Real MySQL] 15-3. 데이터 타입: 날짜와 시간
noahkim_
2023. 11. 26. 15:55
백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.
1. 날짜와 시간
타입 | 설명 | 저장 크기 (byte) |
YEAR | 연도만 저장 (YYYY) | 1 byte |
DATE | 날짜 (YYYY-MM-DD) | 3 byte |
TIME | 시간 (HH:MM:SS) | 3 ~ 5 byte |
TIMESTAMP | 날짜 + 시간 (UTC 기준) | 4 ~ 7 byte |
DATETIME | 날짜 + 시간 (로컬 시간 기준) | 5 ~ 8 byte |
2. 밀리초 저장
괄호
- 괄호안의 숫자는 밀리초 자리 수를 의미함
- 최대 6자리까지 표현할 수 있습니다.
- 2자리당 1바이트씩 공간이 필요합니다.
예
더보기
- DATETIME(6)
3. 타임존
날짜 타입
- 타임존 정보가 포함되지 않음
- 클라이언트로부터 입력된 값을 그대로 저장하고 조회합니다.
시간 타입
항목 | TIMESTAMP | DATETIME |
타임존 처리 | ✅ | ❌ |
저장 기준 | UTC로 변환되어 저장됨 | 입력된 값 그대로 저장됨 |
조회 시 처리 | 세션의 타임존에 맞춰 자동 변환되어 보여짐 | 입력된 로컬 시간이 그대로 조회됨 |
기본 타임존 | 시스템 또는 MySQL 설정에 따라 기본은 UTC | 영향 없음 (타임존 무관) |
용도 추천 | 전역 사용자 간 시간 비교/정렬에 유리 | 로컬 시간 그대로 보존해야 할 경우 유리 |
JDBC Driver
- 날짜/시간 타입을 가져올 때, 클라이언트 타임존으로 자동 변환 발생
예
더보기
ResultSet rs = statement.executeQuery("SELECT ts, dt FROM example");
Timestamp ts = rs.getTimestamp("ts"); // 타임존 변환됨 (UTC → 로컬)
Timestamp dt = rs.getTimestamp("dt"); // 변환 없이 그대로
- ResultSet 클래스에서 DATETIME 컬럼의 값을 가져오는 함수가 getTimestamp()이기 때문
시스템 변수
변수명 | 설명 | 값의 의미 |
system_time_zone | 서버의 기본 타임존 (MySQL 시작 시점 기준) | 운영체제의 타임존에서 상속됨 |
time_zone | 클라이언트 세션의 타임존 설정 | - SYSTEM: system_time_zone 값을 따름 - UTC - Asia/Seoul |
3. 자동 업데이트
CREATE TABLE logs (
id INT PRIMARY KEY AUTO_INCREMENT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
- DEFAULT: insert될 때의 시점을 자동으로 업데이트
- ON UPDATE: update될 때의 시점을 자동으로 업데이트