MySQL에서 행이 새로 추가되거나 갱신되었을 때의 시각을 자동으로 기록하고 싶은 경우가 있을 겁니다. 이런 경우에는 TIMESTAMP나 DATETIME을 이용하면 됩니다.
예를 들어 행 추가 시각을 지정하기 위한 created_at이라는 열과 행 갱신 시각을 지정하기 위한 updated_at이라는 열을 추가하고 싶다면 다음과 같이 하면 됩니다.
CREATE TABLE your_table (
...
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
...
);
이렇게 하면 행이 테이블에 추가될 때마다 그 행의 created_at 열에 현재 시각이 자동으로 기록되고, 행이 업데이트될 때 updated_at 열에 현재 시각이 자동으로 기록됩니다.
MySQL 5.6 이상에서는 DATETIME 타입에서도 DEFAULT CURRENT_TIMESTAMP 옵션 지정이 가능합니다. 둘 사이에는 다음과 같은 차이가 있습니다.
범위/정밀도
TIMESTAMP: 초 단위로 기록하며, 1970-01-01 00:00:01 UTC부터 2038-01-19 03:14:07 UTC까지의 날짜와 시간을 저장합니다.
DATETIME: 마이크로초 단위까지 기록할 수 있으며, 1000-01-01 00:00:00부터 9999-12-31 23:59:59까지의 날짜와 시간을 저장합니다.
시간대 처리
TIMESTAMP: UTC 시간대를 기준으로 저장되고, 검색될 때 서버의 현재 시간대 설정을 기준으로 변환됩니다. 이는 서버의 시간대 설정이 변경되면 저장된 값도 다르게 해석될 수 있다는 것을 의미합니다.
DATETIME: 시간대 변환 없이 저장된 그대로의 값을 유지합니다. 서버의 시간대 설정에 영향을 받지 않습니다.
정밀도 차이 때문에 TIMESTAMP는 4 바이트 공간을 차지하며 DATETIME은 버전 5.6.4 이전에서는 8바이트를 사용했고, 그 이후 버전에서는 마이크로초 정밀도에 따라서 5-8바이트를 사용할 수 있습니다.
2038년 시간 제한을 생각하면 그냥 속 편하게 항상 DATETIME을 사용하는 것도 나쁘지 않을 것 같습니다.