MySQL TIMESTAMP type’s Year 2038 Problem

최대 1 분 소요

들어가며

회사에서 간혹 TIMESTAMP 형식으로 지정된 column에 ‘0000-00-00 00:00:00’ 값이 들어가서 문제가 된 경우가 있었다. 값을 Python의 datetime 형태로 변환하는 과정에서 ‘0년 0월 0일’과 같이 년/월/일에는 0이 들어가면 ValueError가 발생하는 문제였다.

TIMESTAMP Data Type

MySQL의 TIMESTAMP는 날짜와 시간을 모두 포함하는 자료형(data type) 중 하나이다. 비슷한 자료형 중 하나인 DATETIME과 달리 시간대(time zone)를 변경하면 표시되는 시간도 바뀌어 표시되는데, 이는 TIMESTAMP는 저장할 때 UTC로 변환되어 저장되고 이후 검색할 때 서버의 시간대로 변환하기 때문이다.

TIMESTAMP의 범위는 1970-01-01 00:00:01.000000’ UTC 에서 ‘2038-01-19 03:14:07.999999’ UTC 까지로, 범위에서 벗어날 경우 ‘0000-00-00 00:00:00’ 값으로 변환되거나 NO_ZERO_DATE sql mode를 활성화 할 경우 에러를 발생시킨다.

원인

Year_2038_problem

위 그림에서 보듯이 signed 32bit integer를 사용하면 TIMESTAMP와 같은 범위로 제한됨을 볼 수 있다. 이 문제는 Year 2038 problem 으로 알려져 있다.

해결법

현재 시간 기록 용도가 아닌 시간을 입력값으로 받는 경우, TIMESTAMP보다는 DATETIME을 사용하는 것이 안전하다고 생각한다. 만일 시간대 정보가 필요하다면, 항상 UTC 기준으로 DATETIME을 저장하고 시간대에 따라 변환시켜 사용하는 방법도 사용할 수 있을 것이다.

References

댓글남기기