한참 MySQL
의 데이터 타입을 정리해 나가고 있는데, 비슷한 값을 저장하는 TIMESTAMP
와 DATETIME
을 왜 따로 설정해서 사용하는지 궁금해졌다.
TIMESTAMP
와 DATETIME
은 둘 다 기본 형식이 YYYY-MM-DD HH:MM:SS
이다. 이외에 형식을 지키지 않는 입력이 들어오면 0을 저장한다. 그래서 깊게 생각하지 않고 날짜와 시간을 저장하기 위해서 사용하는 거면 둘 다 사용해도 무방해 보인다.
TIMESTAMP는 날짜와 시간을 나타내는 타임스탬프를 저장할 수 있는 타입입니다.
TIMESTAMP 타입의 필드는 사용자가 별다른 입력을 주지 않으면, 데이터가 마지막으로 입력되거나 변경된 시간이 저장됩니다.
따라서 데이터의 최종 변경 시각을 저장하고 확인하는 데 유용하게 사용됩니다.-- TCP SCHOOL 설명
이 설명만 보고 나는 TIMESTAMP
는 따로 다른 설정을 안해줘도 데이터가 입력이 되거나 수정될 때마다 현재 시간을 저장하게 만드는 타입으로 생각하고 사용하였다.
하지만 테이블 생성 후에, 테이블 컬럼에 대한 정보들을 확인해보면 TIMESTAMP
로 타입이 지정된 DATE
칼럼에 기본값과 따로 어떤 설정도 안 되어 있는 것을 확인할 수 있다.
당연하게도 새로운 레코드를 추가하였을 때 DATE
는 아무 값도 들어있지 않다. 따라서 내가 알고 있던 TIMESTAMP
의 기본적인 기능조차도 작동이 안 된다는 것을 확인했다.
결국 내가 직접 컬럼의 Default 값을 NOW()
로 설정해주었다. 이제는 새로운 레코드가 저장될 때마다 따로 DATE
컬럼의 값을 지정해주지 않아도 현재 시각으로 저장을 하게 된다.
이제 기존의 레코드를 수정할 때 따로 INSERT INTO
에 기입하지 않아도 자동으로 수정된 날짜를 자동으로 바뀌게 만들려고 한다.
mysql > ALTER TABLE VISIT ADD COLUMN UPDATE_DATE TIMESTAMP DEFAULT NOW() ON UPDATE NOW();
mysql > INSERT INTO VISIT (CUSTOMER_ID) VALUE(2);
mysql > UPDATE VISIT SET CUSTOMER_ID = 3 WHERE ID = 5;
위의 MySQL
구문은 ON UPDATE
가 핵심이다. 직관적으로 의미를 알 수 있듯이, 업데이트 될 때 어떤 값으로 대체할지에 대한 선언문이라 생각하면 되겠다.
이후 새로운 레코드를 추가해줬고, 업데이트 될 때 시간이 의도했던 데로 갱신되는지 확인해봤다.
이제서야 내가 알고있던 TIMESTAMP
의 기능이 구현되었다.
결론적으로 똑같은 명령어를 사용하여 기능을 구현시키면 똑같이 작동한다.
그래서 자동 생성, 자동 갱신으로DATETIME
과TIMESTAMP
를 구분하여 사용할 수 없다.
TIMESTAMP
는 UNIX timestamp 를 사용한다. 그래서 "1970-01-01 00:00:01 UTC" 부터 "2038-01-19 03:14:07 UTC" 에서만 사용할 수 있다.
DATETIME
은 MySQL
에 종속되어 있는 시간 타입을 사용한다. "9999-12-31 23:59:59"의 범위까지 사용할 수 있다.
대신 TIMESTAMP
의 경우는 시간 계산이 용이하다는 장점이 있다. 특히 세계적으로 국가마다 다른 표준시간을 정해놓고 사용하는데, TIMESTAMP
는 해당 국가의 표준시간에 맞춰 저장을 하게 도와준다. 여러 지역에서 서비스되는 프로그램이면 TIMESTAMP
를 사용하는게 나을 수 있다.