데이터베이스/MySQL

[MySQL] Timestamp 타입과 Datetime 타입의 차이 🕰

jaee 2022. 8. 14. 21:03

 

 

이 포스팅을 하게 된 이유는 업무 중 우연히 어떤 에러를 발견했기 때문이었다. 당시 데이터 만료 기간을 설정하는 중이었고 특정 조건에서는 만료 기간을 과거 날짜로 세팅하여 데이터 제공을 중단하기로 했다. 그런데 이 과정에서 Timestamp 타입에 알맞지 않은 값이라는 에러가 발생했고 이에 대해 MySQL 날짜 타입인 Timestamp와 Datetime의 차이가 궁금해졌다.

INSERT INTO mydb.tb_test(date_datetime, date_timestamp) VALUES('1970-01-01', '1970-01-01');

timestamp 타입에 1970-01-01을 insert하면 에러가 발생한다

 

차이점 1

Timestamp 타입은 1970-01-01 00:00:01 ~ 2038-01-19 08:44:07까지의 데이터만 지원하고, Datetime 타입은 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 사이의 데이터를 지원한다.

 

 

차이점 2

(MySQL 5.6.4 버전 이상 기준) Timestamp는 4 bytes+ 3byte(초 단위를 저장하기 위함) 크기를 필요로 하며, Datetime 타입은 5byte + 3byte(초 단위를 저장하기 위함) 크기를 필요로 한다. 

 

 

차이점 3

Timestamp 타입의 값은 현재 시각 → UTC 시각으로 변환되며 Datetime은 변환되지 않는다. 만약 글로벌 서비스에서 Datetime을 사용하여 날짜를 표현할 경우, 한국에서 17:00시에 작성된 글이 미국에서도 그대로 17:00시에 저장된 것처럼 보일 수 있다. 그러므로 Timestamp 타입을 사용하여 날짜를 표현하는 게 좋다.

 

 

차이점 4

Timestamp 타입은 인덱스를 타지만 Datetime 타입은 인덱스를 타지 않는다.

(수정) Timestamp와 Datetime 모두 인덱스 잘 탄다.

 

 

차이점 4

Timestamp 타입을 갖는 쿼리는 캐시로 저장되나 Datetime 타입을 갖는 쿼리는 캐시로 저장되지 않는다.

 

 

 

결론: 웬만하면 날짜 형식은 Timestamp 타입을 사용하자.

 

 


참고자료