나는 DATETIME
대 TIMESTAMP
대 INT
사이에 프로 또는 콘트라의 다른 토론을 시작하고 싶지 않습니다. (이미 Using MySQL's TIMESTAMP vs storing timestamps directly과 같은 기사를 읽었습니다.)유닉스 타임 스탬프를 부호없는 정수로 저장하면 어떤 이점이 있습니까?
가끔 INT
데이터 형식을 사용하여 유닉스 타임 스탬프를 데이터베이스에 저장합니다. 그 이유는 내 응용 프로그램에서 날짜 및 시간 계산이 유닉스 타임 스탬프 (예 : 세션 시간 초과 및 토큰 만료)를 사용했기 때문입니다. 또한 WHERE
절의 정수 값을 간단히 비교할 수있을 때 DATETIME
을 사용하는 것보다 데이터베이스에서의 데이터 선택이 빠릅니다. 이 4 바이트가 실제로 작은 크기로 인해 디스크와 메모리에 저장 공간을 절약 할 수있는 10 백만 행 (최대 1 억)이있는 테이블은 거의 없습니다.
는 Y2K38 문제에 관해서는, 나는 UNIX_TIMESTAMP
있는 MySQL PHP의 time()
향후 64 비트 값을 반환되므로, 응용 프로그램 자체에서 뭔가를 변경할 필요가 없을 것, 가정 (그래서 희망). 요점은, 나는이 모든 정수형 타임 스탬프를 부호없는 정수 (즉, INT
이 아닌 BIGINT
)로 MySQL에 저장했습니다. 물론, 지금은 부호없는 정수의 타임 스탬프는 올해 2106에 오버플로,하지만 2038
내 질문보다 조금 더 시간 : UNIX_TIMESTAMP
자체가 2038 이후에 작동 할 것이라고 가정까지 MySQL과/또는 PHP에 문제가있을 수 이 타임 스탬프가 MySQL에서 부호없는 정수로 저장되면 2106? (과 논쟁하지 마십시오 : 2038까지, 나는 더 이상 접촉하지 않는 응용 프로그램의 관점에서이 문제를 명확히 할 것을 해결하기 위해 많은 시간이있을 것이다)
편집 : 질문이 와서 때문에 : 저는이 칼럼에 현재 타임 스탬프 만 저장합니다. 생년월일도 미래 날짜도 저장하지 않습니다. 현재의 타임 스탬프 만 있으므로 2038 년 이후에 작동하는지 명확히하고 싶습니다.
32 비트 범위를 벗어나는 값이 필요한 경우; 그런 다음 32 비트 시스템에서 유닉스 타임 스탬프를 사용하지 마십시오. PHP에서 DateTime 객체를 사용하고 MySQL에서 DATETIME을 사용하면 ... 1970 년 이전이기 때문에 제 생일을 서명되지 않은 유닉스 타임 스탬프로 저장할 수 없었습니다. 따라서 과거의 비용으로 제한을 미래로 단순히 옮기고 있습니다. –
@ MarkBaker 그것은 당신이 저장하고 싶은 것에 달려 있습니다. 내 blogpost가 작성된 날짜를 저장하려고한다고 가정 해보십시오. (UNSIGNED) INT는 괜찮습니다. – AmazingDreams
@MarkBaker "예 : 세션 시간 초과 및 토큰 만료" – rabudde