SQL

[MySQL] DATETIME vs TIMESTAMP (MySQL 8.4 기준, 근거 포함)

콩콩(๓° ˘ °๓)♡ 2025. 9. 26. 11:05

데이터베이스 설계 중, 로그 남기는 부분에 DATETIME과 TIMESTAMP 둘 중에 뭘 선택할지 고민하다가 검색 & 조사하여 정리한 글이다. 

1. 저장 가능 범위

  • DATETIME
    → '1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999'
  • TIMESTAMP
    → '1970-01-01 00:00:01.000000' UTC ~ '2038-01-19 03:14:07.999999' UTC`
    📖 8.4.11 Date and Time Data Types, “The DATETIME type”, “The TIMESTAMP type” (MySQL 8.4 Docs)

2. 저장 크기 (Storage Requirements)

  • DATETIME: 5 bytes + fractional seconds storage (0~3 bytes)
  • TIMESTAMP: 4 bytes + fractional seconds storage (0~3 bytes)
    📖 11.7 Data Type Storage Requirements, Table 11.2 Storage Requirements for Temporal Types

3. 타임존 처리

  • DATETIME: 입력된 값 그대로 저장/조회 (타임존 변환 없음)
  • TIMESTAMP: 저장 시 “current time zone → UTC”, 조회 시 “UTC → current time zone” 변환
    📖 8.4.11 Date and Time Data Types, “The TIMESTAMP type” 항목

4. 자동 초기화 / 자동 갱신

  • DEFAULT CURRENT_TIMESTAMP 와 ON UPDATE CURRENT_TIMESTAMP → TIMESTAMP, DATETIME 둘 다 가능
  • MySQL 5.6.5 이상부터 DATETIME도 지원
    📖 8.4.12 Automatic Initialization and Updating for TIMESTAMP and DATETIME

5. 용도 구분 (공식 문서에 나온 권장 사용 패턴)

  • DATETIME
    • “values that contain both date and time parts”
    • timezone-independent representation → 과거·미래의 특정 시각 그대로 저장
  • TIMESTAMP
    • “values that include both date and time, with automatic time zone conversion”
    • 로그, 기록 시각 등에 권장
      📖 8.4.11 Date and Time Data Types, 각 타입 설명 부분

❌ 정정사항

  • “TIMESTAMP 쿼리는 캐시되지만 DATETIME은 캐시되지 않는다”
    MySQL 매뉴얼에 언급 없음. Query Cache는 MySQL 8.0에서 제거되었고, 타입별 캐시 차별은 공식 문서 근거 없음.
    📖 8.10.3 The Query Cache (Note: Removed in MySQL 8.0)
  • “DATETIME은 8바이트”
    → 구버전 설명. 현재는 공식 문서 기준 5 bytes (+ fractional seconds 0~3).
    📖 11.7 Data Type Storage Requirements

✅ 최종 요약:

  • 범위: TIMESTAMP(1970~2038) vs DATETIME(1000~9999)
  • 저장 크기: TIMESTAMP 4+fsp vs DATETIME 5+fsp
  • 타임존: TIMESTAMP 변환 O vs DATETIME 변환 X
  • 자동값: 둘 다 DEFAULT/ON UPDATE 지원 (MySQL 5.6.5+)
  • 캐시 차이: 공식 문서 근거 없음 (블로그 잘못된 설명)

 

  • created_at / updated_at: DATETIME 권장 (과거/미래 유지, 범위 안전)
  • last_accessed_at: TIMESTAMP도 가능 (로그 성격, 글로벌 서비스 변환 필요시)

 

참조

https://jaejade.tistory.com/125