지난 프로젝트에서 게시판 위주로 작업을 했다보니 이번에도 버릇처럼 날짜가 들어가야 하는 회원 생년월일 필드의 데이터 타입을 TIMESTAMP로 설정했다.
그리고 회원가입 기능을 구현하다가
우연히 생년월일을 1945년 1월 1일로 입력했는데...
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1945-01-01' for column 'user_birth' at row 1
오류가 떴다.
값을 잘못 입력했나 싶어 다시 입력도 해보았지만 여전했다.
기존 입력 값들과 유독 달랐던 것은 연도 뿐이기에 혹시나 싶어 검색을 해보았다.
UNIX 시간(UNIX time)은 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 초로 환산하여 정수로 나타낸 것이다.
32비트로 표현된 유닉스 시간은 1970년 1월 1일 00:00 (UTC)에서 2,147,483,647 (231 - 1) 지난 후인 2038년 1월 19일 03:14:08 UTC에 2038년 문제를 발생시킨다. ( 출처 : 위키백과 )
MySQL에서 지원하는 TIMESTAMP는 이 오류가 해결되지 않아서
1970-01-01 00:00:01부터 2038-01-19 03:14:07까지의 범위만을 저장한다고 한다.
이를 해결하기 위해서는 1000-01-01 00:00:00에서 9999-12-31 23:59:59까지 저장 가능한 DATE 혹은 DATETIME 데이터 타입을 사용해야 한다.
이를 확인하고 데이터 타입을 변경하니 다시 잘 실행이 되었다.
이번 기회에 TIMESTAMP 사용 시 주의해야 할 점에 대해 알게 되었다.
가끔가다 잘못 저장된 파일들의 연도가 항상 1970년이었던 것도 이제서야 이해되었다.
2038년 1월 19일 3시 14분 8초
이 때 세상은 어떤 모습일까?
이미 일어날 문제들을 잘 해결해 유쾌하게 카운트다운을 할까?
아니면 대혼란의 시기가 찾아올까?
뭐가 됐든 골치 아프고 즐거울 것 같다.
흥미가 있으신 분들은 2038년 문제를 읽어보시길!