MySQL | datetime vs timstamp

isthis·2022년 10월 2일
0

Mysql의 time datatype에는 datetime과 timestamp를 적용할 수 있다. 이 둘의 차이점에 대해 알아보자.

Datetime 특징

  • 5.6버전 이상부터 CURRENT_TIMESTAMP 적용 가능
  • 날짜와 시간 모두 포함한 타입(YYYY-MM-DD hh:mm:ss)
  • time_zone과 상관없이 고정된 값 저장(current_timestamp 적용 시 utc-0 기준 저장)
  • 날짜 및 시간 정보를 모두 포함하는 값이 필요할 때 사용
  • 지원범위 : '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
  • 용량 : 8byte

timestamp 특징

  • 날짜와 시간 모두 포함한 타입(YYYY-MM-DD hh:mm:ss)
  • time_zone에 의존하여 UTC 값 저장
    • time_zone 변경 시 해당 time_zone의 시간(UTC)으로 변경됨
  • Index가 더 빠르게 생성됨
  • 지원범위 : '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC
  • 용량 : 4byte

고려 사항

위와 같은 특징들을 고려하였을 때, 어떤 datatype을 사용하는 게 좋은 선택일까?
아래와 같은 상황들에 따라 달라질 것 같다.

  1. 넓은 범위의 날짜를 저장해야 하는 경우
  2. DataBase 서버가 여러 국가에 존재하는 경우(time-zone도 다 다름)
  3. DataBase 서버의 time-zone은 하나지만, 글로벌 서비스를 구축해야 하는 경우

1번의 경우, timestamp는 지원범위가 짧으므로 datetime이 적합할 것이다.
2번의 경우, 서버에 따라 해당 지역의 시간을 보여줘야 하므로 자동으로 해당 지역 UTC로 변경되는 timestamp가 적합해 보인다.
3번의 경우, 서버에 저장되는 데이터를 time-zone에 영향을 받지 않는 절대값으로 설정 후, 클라이언트의 Locale에 따른 계산값을 제공을 해줘야 하므로 datetime이 적합해 보인다.

물론 경우에 따라 위의 방법과 다를 수도 있겠다.

추가정보

date 관련 data option 설정

  • DEFAULT CURRENT_TIMESTAMP
    • 현재 timestamp 값을 Insert 시점에 기본값으로 Set 한다.
  • ON UPDATE CURRENT_TIMESTAMP
    • 해당 row가 Update될 경우 자동으로 해당 시점의 timestamp 값으로 set 된다.
    • 위 2가지를 병행 기재 함으로 Insert / Update 될 경우 자동 설정을 모두 취할 수 있다.
      (ex. TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)

mysql timezone 관련 쿼리

  • Mysql Timezone 확인
    SELECT @@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;
  • 현재 시간과 Mysql 시간
SELECT NOW();
  • Mysql Timezone 변경
set global time_zone = 'Asia/Seoul';
set time_zone = 'Asia/Seoul';
SELECT @@GLOBAL.time_zone, @@SESSION.time_zone, @@system_time_zone;
SELECT NOW();
  • SET설정은 일회용이다.
    set 설정 변경이 가능하지만 만약 DB서버가 재시작 된다면 방금 추가한 set 설정이 사라진다.그렇기에 Mysql의 설정파일 my.ini 에서 영구적으로 변경이 필요하다.
    • DB 설정 파일에서 변경
      • OS(Window, CentOS 등..)별로 윈도우(my.ini) 또는 리눅스(my.cnf) 등 설정파일의 위치가 다르다. 위치는 검색하면 os별로 찾을수 있다.
      • 설정 파일에 아래와 같이 입력하고 Mysql을 Restart 하면 언제든 재시작시 Timezone설정으로 실행된다.
      [mysqld]
      default-time-zone='Asia/Seoul'

잘못된 정보나 추가 정보, 조언이 있을 경우 댓글로 말씀 부탁드려요!

참고자료
mysql 공식문서
nesoy blog
jyson.log

profile
공부

0개의 댓글