MySQL의 DATETIME과 TIMESTAMP 타입은 모두 날짜와 시간을 함께 저장하며, “YYYY-MM-DD HH:MM:SS” 형식으로 값을 표현한다는 공통점이 있습니다. 하지만 겉보기에 비슷해 보이는 이 두 타입 사이에는 실무에서 반드시 알아야 할 중요한 차이점들이 존재합니다.
DATETIME과 TIMESTAMP의 주요 차이점
1. 저장 가능 범위(Range)
DATETIME은 1000-01-01 00:00:00부터 9999-12-31 23:59:59까지 매우 넓은 범위의 날짜와 시간을 지원합니다. 반면 TIMESTAMP는 '1970-01-01 00:00:01'부터 '2038-01-19 08:44:07'까지만 지원하며, 이는 UNIX 타임스탬프의 특성 때문입니다.
2. 저장 용량(Size)
DATETIME은 기본적으로 5바이트를 사용하고, 소수점 이하 초(fractional seconds)를 저장할 때는 3바이트가 추가로 필요합니다. TIMESTAMP는 기본 4바이트에 소수점 이하 초 저장 시 마찬가지로 3바이트가 추가됩니다. 단, MySQL 5.6.4 이전 버전에서는 DATETIME이 8바이트를 사용했습니다.
3. 시간대(Timezone) 변환
MySQL 5 이상에서 TIMESTAMP 값은 저장 시 현재 시간대에서 UTC로 변환되며, 조회할 때 다시 해당 세션의 시간대로 되돌려집니다. 반면 DATETIME은 어떠한 시간대 변환도 수행하지 않고 입력된 값 그대로 저장됩니다.
4. 인덱싱(Indexing)
일반적으로 TIMESTAMP 컬럼에는 인덱스를 생성할 수 있는 반면, DATETIME 컬럼에는 인덱싱이 불가능하다고 알려져 있습니다. 다만 최근 버전의 MySQL에서는 두 타입 모두 인덱스 생성이 가능하므로, 사용 중인 버전의 공식 문서를 함께 확인하는 것이 좋습니다.
5. 쿼리 캐싱(Query Caching)
TIMESTAMP 타입을 포함한 쿼리는 캐시될 수 있지만, DATETIME 타입을 사용한 쿼리는 캐시되지 않습니다.
이상이 DATETIME과 TIMESTAMP 타입의 주요 차이점이며, 아래 예제를 통해 이를 직접 확인해 보겠습니다.
예제
mysql> Create table test_datetime(time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.44 sec) mysql> INSERT INTO test_datetime (time) values (CURRENT_TIMESTAMP); Query OK, 1 row affected (0.04 sec) mysql> Select * from test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+ 1 row in set (0.00 sec) mysql> Create table test_timestamp(time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.64 sec) mysql> INSERT INTO test_timestamp (time) values (CURRENT_TIMESTAMP); Query OK, 1 row affected (0.06 sec) mysql> Select * from test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:50 | +---------------------+ 1 row in set (0.00 sec)
이제 세션 시간대를 UTC-05:00으로 변경한 뒤 다시 조회하면, TIMESTAMP 타입 테이블의 결과 값이 시간대에 맞게 자동 변환되어 표시되는 것을 확인할 수 있습니다.
mysql> SET @@session.time_zone = '-5:00'; Query OK, 0 rows affected (0.00 sec) mysql> Select * from test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 06:59:50 | +---------------------+ 1 row in set (0.00 sec)
결과
mysql> Select * from test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+ 1 row in set (0.00 sec)
위 결과에서 볼 수 있듯이 TIMESTAMP 컬럼은 시간대 변경에 따라 값이 자동으로 변환되는 반면, DATETIME 컬럼은 시간대와 무관하게 항상 동일한 값을 유지합니다.
어떤 타입을 선택해야 할까?
여러 시간대의 사용자를 가진 글로벌 서비스라면 시간대 변환이 자동으로 처리되는 TIMESTAMP가 유리합니다. 반면 시간대와 상관없이 입력된 값을 그대로 보존해야 하거나 2038년 이후의 날짜를 다루어야 한다면 DATETIME을 선택하는 것이 더 안전합니다.