목차
타임스탬프 데이터 액세스
타임스탬프 필드 정의
타임스탬프 유형으로 인한 예외
타임스탬프 유형 및 시간 유형 선택
타임스탬프 유형 사용에 대한 권장 사항
date 및 mydate에 값을 할당하지 않고 특정 데이터가 업데이트되거나 새 데이터가 삽입되면 date 및 mydate 두 필드가 자동으로 현재 기본값으로 설정됩니다. time
타임스탬프에 저장된 시간이 '2038-01-19 03:14:07'UTC보다 큰 경우 mysql은 오류를 보고합니다. 이는 mysql 자체의 문제이므로 타임스탬프가 초과하면 당연히 오류가 보고됩니다. 일부 스크린샷은 다음과 같습니다.
timestamp 상한이 있지만 타임스탬프를 저장하므로 시간대 관련 요구 사항을 처리해야 하는 경우에는 시간대 문제를 고려할 필요가 없습니다. , 2038 제한을 해결할 수 있습니다. 타임스탬프를 정수 유형으로 변경하여 타임스탬프를 저장한 다음 프로그램에서 변환하는 것이 좋습니다(이 솔루션은 구현되지 않았으며 단지 제안일 뿐이므로 주의해서 사용하세요! !)
데이터 베이스 MySQL 튜토리얼 MySQL의 타임스탬프 2038 문제를 해결하는 방법

MySQL의 타임스탬프 2038 문제를 해결하는 방법

Jun 02, 2023 am 10:13 AM
mysql timestamp

타임스탬프는 1970년 1월 1일 00:00:00 GMT(베이징 시간 1970년 1월 1일 08:00:00)부터 현재까지의 총 초 수를 나타냅니다.
MySQL 5.5/5.6/5.7의 세 가지 주요 버전과 N 마이너 버전을 포함하여 다양한 버전의 MySQL이 프로덕션 환경에 배포됩니다. MySQL의 낮은 상위 호환성으로 인해 동일한 SQL이 다음과 같이 버전마다 다르게 동작합니다. 데이터 유형은 여러 측면에서 자세히 소개됩니다.

타임스탬프 데이터 액세스

위의 세 가지 주요 MySQL 버전에서 기본 타임스탬프(Timestamp) 유형의 값 범위는 ’1970-01-01 00:00:01’ UTC부터 ’2038-01 - 19 03:14:07’ UTC에서 데이터는 두 번째 수준까지 정확합니다. 이 값 범위에는 약 22억 개의 값이 포함되어 있으므로 4바이트 INT 유형이 타임스탬프 데이터를 저장하는 데 사용됩니다.
1. 데이터를 스탬핑할 때 먼저 현지 시간대 시간을 UTC 시간대로 변환한 다음, UTC 시간대 시간을 UNIX_TIMESTAMP 함수를 사용하여 INT 형식의 밀리초 값으로 변환한 후 데이터베이스에 저장합니다.
2. 타임스탬프 데이터를 읽을 때 먼저 INT 형식의 밀리초 값을 FROM_UNIXTIME 함수를 사용하여 UTC 시간대 시간으로 변환한 다음 이를 현지 시간대로 변환하고 마지막으로 클라이언트에 반환합니다.

MySQL 5.6.4 이상 버전에서는 타임스탬프 유형 데이터를 마이크로초(백만분의 1초) 단위로 가장 높은 정밀도로 저장할 수 있습니다. 데이터 유형은 타임스탬프(N)로 정의됩니다. N의 값 범위는 0-6입니다. 기본값은 0입니다. 밀리초 단위로 정확해야 하면 Timestamp(3)로 설정하고, 마이크로초 단위로 정확해야 하면 Timestamp(6)로 설정하세요. 내부 저장 공간은 있지만 타임스탬프 유형은 변경되지 않습니다.

타임스탬프 필드 정의

타임스탬프 필드 정의는 주로 두 가지 유형의 작업에 영향을 미칩니다.

  • 레코드를 삽입할 때 타임스탬프 필드에는 DEFAULT CURRENT_TIMESTAMP가 포함됩니다. 레코드를 삽입할 때 특정 시간 데이터가 지정되지 않으면 타임스탬프 필드가 포함됩니다. 현재 시간

  • 에 대한 레코드를 업데이트할 때 타임스탬프 필드에 ON UPDATE CURRENT_TIMESTAMP가 포함됩니다. 레코드 업데이트 시 특정 시간 데이터가 지정되지 않으면 타임스탬프 필드 값이 현재 시간

  • 으로 설정됩니다.

PS1: CURRENT_TIMESTAMP는 NOW() 함수와 유사하게 CURRENT_TIMESTAMP( ) 함수를 사용하여 현재 시간을 가져오는 것을 의미합니다.

위의 두 가지 작업 유형에 따라 타임스탬프 열에는 네 가지 조합 정의가 있을 수 있으며 그 의미는 다음과 같습니다.

  • 필드가 타임스탬프로 정의되면 해당 필드가 삽입이나 업데이트 모두 자동으로 현재 시간으로 설정되지 않음을 의미합니다.

  • 필드가 타임스탬프 DEFAULT CURRENT_TIMESTAMP로 정의되면 필드는 삽입 시 현재 시간만 할당되고 값이 지정되지 않으며 업데이트되고 값이 지정되지 않을 때 수정되지 않음을 의미합니다.

  • 필드가 타임스탬프 ON UPDATE CURRENT_TIMESTAMP로 정의되면 삽입 시 필드에 "0000-00-00 00:00:00" 값이 할당되고 값이 지정되지 않으며 현재 시간으로 업데이트된다는 의미입니다. 업데이트되고 값이 지정되지 않은 경우.

  • 필드가 타임스탬프 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP로 정의되면 삽입 또는 업데이트 시 필드에 값이 지정되지 않고 현재 시간이 할당된다는 의미입니다.

PS1: MySQL에서 실행되는 테이블 생성 문과 최종 테이블 생성 문에는 차이가 있습니다. 생성된 테이블의 테이블 생성 문을 얻으려면 SHOW CREATE TABLE TB_XXX를 사용하는 것이 좋습니다.

다양한 MySQL 버전의 타임스탬프 필드 사용 차이

  • MySQL 5.5 및 이전 버전에서는 하나의 타임스탬프 필드에 대해 DEFUALT CURRENT_TIMESTAMP 또는 ON UPDATE CURRENT_TIMESTAMP만 정의할 수 있었지만 MySQL 5.6 및 MySQL에서는 이것이 취소되었습니다. 5.7. 이 제한 사항

  • MySQL 5.6 버전에서는 explain_defaults_for_timestamp 매개변수의 기본값이 1이고, MySQL 5.7 버전에서는explicit_defaults_for_timestamp 매개변수의 기본값이 0입니다.

  • MySQL 5.5 및 MySQL 5.7 버전에서는 타임스탬프 유형의 기본값은 NOT NULL입니다. MySQL 5.6 버전에서는 타임스탬프 유형의 기본값은 NULL입니다.

c1 타임스탬프가 테이블 생성 문에 설정된 경우

  • 는 MySQL 5.5 DEFAULT CURRENT_TIMESTAMP의 c1 타임스탬프 NOT NULL과 동일합니다. ON UPDATE CURRENT_TIMESTAMP;

  • MySQL 5.6의 c1 타임스탬프 NULL DEFAULT NULL과 동일;

MySQL 5의 c1 타임스탬프 NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP와 동일합니다. 7;

  • c1 타임스탬프가 기본값인 경우 0은 테이블 생성 문에 사용됩니다.

  • MySQL 5.5의 c1 timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’

  • c1 timestamp NULL ‘0000과 동일합니다. MySQL 5.6에서 -00-00 00: 00:00’;

은 MySQL 5.7에서 c1 타임스탬프 NOT NULL DEFAULT ‘0000-00-00 00:00:00’;

🎜과 동일합니다. licit_defaults_for_timestamp 매개변수의 기본값입니다. 🎜🎜PS2: 타임스탬프 열의 기본값이 ’0000-00-00 00:00:00’인 경우 "타임스탬프 값 범위 내에 있지 않음"의 기본값을 사용하면 경고가 생성되지 않습니다. 🎜

타임스탬프 유형으로 인한 예외

MySQL 매개변수 time_zone=system일 때 타임스탬프 필드를 쿼리하면 시간대 변환을 위해 시스템 시간대가 호출됩니다. 그러나 시스템 시간대의 전역 잠금 문제로 인해 스레드 컨텍스트가 자주 발생합니다. 여러 개의 동시 대용량 데이터 액세스가 발생하면 스위치, CPU 사용량이 급증하고 시스템 응답이 느려지고 일시 중지된 애니메이션이 설정됩니다.

타임스탬프 유형 및 시간 유형 선택

일부 "데이터베이스 지침" 문서에서는 날짜/시간 필드 대신 타임스탬프 유형을 사용하는 것이 좋습니다. 그 이유는 타임스탬프 유형이 4바이트를 사용하는 반면 날짜/시간 필드는 8바이트를 사용하기 때문입니다. 하지만 실제 프로덕션 환경에서는 타임스탬프 유형을 사용해도 성능이 크게 향상되지 않으며, 타임스탬프 유형의 정의 및 값 범위로 인해 비즈니스 사용에 제한이 있을 수 있습니다.

MySQL 5.6.4 이상 버전에서는 타임스탬프 유형(timestamp) 데이터를 가장 높은 정밀도의 마이크로초로 변환할 수 있으며, 시간 유형(datetime) 데이터도 가장 높은 정밀도의 마이크로초로 변환할 수 있습니다. ) 또한 타임스탬프 유형을 얻을 수 있습니다. 예를 들어 필드를 dt1 DATETIME(3) NOT NULL DEFAULT NOW(3) ON UPDATE NOW(3);으로 정의하는 것과 같습니다. 시간 유형(datetime)의 액세스 범위는 ’1000입니다. -01-01 00:00:00.000000’ "9999-12-31 23:59:59.999999"로 변경하면 각 기간의 데이터를 더 잘 저장할 수 있습니다.

타임스탬프 유형 사용에 대한 권장 사항

데이터의 마지막 업데이트 시간만 중요시하는 경우 타임스탬프 열을 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

생성 시간과 업데이트 시간을 권장합니다. 업데이트 시간을 타임스탬프 필드로 설정하고 생성 시간을 DAETIME 또는 TIMESTAMP DEFAULT ‘0000-00-00 00:00:00’로 정의하고 레코드를 삽입할 때 생성 시간을 명시적으로 지정합니다

. 단일 타임스탬프 열만 정의하고 DEFAULT 및 ON UPDATE 속성을 명시적으로 정의하는 것이 좋습니다.

MySQL에서는 타임스탬프 필드를 할당하거나 업데이트할 수 있지만 필요한 경우에만 타임스탬프 열을 명시적으로 삽입하고 업데이트하는 것이 좋습니다.

time_zone 매개변수를 시스템 외부의 값으로 설정하는 것이 좋습니다. 예를 들어 중국 서버는 "+8:00"으로 설정됩니다.

MySQL 오프라인 테스트 버전과 온라인 프로덕션 버전을 유지하는 것이 좋습니다. 일관된.

Timestamp와 datetime의 유사점과 차이점

동일점:

  • 은 자동으로 업데이트 및 초기화될 수 있으며 기본 표시 형식은 동일 YYYY-MM-dd HH:mm:ss

차이:

  • 타임스탬프 시간 범위는 다음과 같습니다: ‘1970-01-01 00:00:01’ UTC ~ ‘2038-01-19 03:14:07’ 자동 시간대 변환, 밀리초의 실제 저장 바이트 저장

  • 날짜/시간의 시간 범위: ‘1000-01-01 00:00:00’ ~ ‘9999-12-31 23:59:59’ 시간대, 8바이트 저장을 지원하지 않습니다.

  • 타임스탬프 및 날짜 설정 자동 업데이트 시간

date 및 mydate에 값을 할당하지 않고 특정 데이터가 업데이트되거나 새 데이터가 삽입되면 date 및 mydate 두 필드가 자동으로 현재 기본값으로 설정됩니다. time

CREATE TABLE `mytime` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` timestamp(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  `mydate` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
로그인 후 복사

2038 문제

타임스탬프에 저장된 시간이 '2038-01-19 03:14:07'UTC보다 큰 경우 mysql은 오류를 보고합니다. 이는 mysql 자체의 문제이므로 타임스탬프가 초과하면 당연히 오류가 보고됩니다. 일부 스크린샷은 다음과 같습니다.

MySQL의 타임스탬프 2038 문제를 해결하는 방법Solution

timestamp 상한이 있지만 타임스탬프를 저장하므로 시간대 관련 요구 사항을 처리해야 하는 경우에는 시간대 문제를 고려할 필요가 없습니다. , 2038 제한을 해결할 수 있습니다. 타임스탬프를 정수 유형으로 변경하여 타임스탬프를 저장한 다음 프로그램에서 변환하는 것이 좋습니다(이 솔루션은 구현되지 않았으며 단지 제안일 뿐이므로 주의해서 사용하세요! !)

시간대 문제를 고려할 필요가 없다면 datatime 유형의 타임스탬프로 직접 대체하면 충분합니다. datatime의 값 범위가 훨씬 크기 때문에 위의 그림을 볼 수 있습니다.


교체 아이디어:

1. 원본 필드의 이름을 수정합니다.

ALTER TABLE `student` CHANGE `entry_date` `temp_entry_date` timestamp NOT NULL default '0000-00-00 00:00:00';
로그인 후 복사

새 데이터 시간 유형 필드를 만듭니다(원본을 대체할 새 열 생성).

ALTER TABLE `student` ADD `entry_date` DATETIME NOT NULL default '0000-00-00 00:00:00';
로그인 후 복사

원래 필드 열의 데이터를 새 필드 열에 복사합니다.

UPDATE `student` SET `entry_date` = `temp_entry_date`;
로그인 후 복사

전체 SQL은 다음과 같습니다. (원래 타임스탬프의 기본값도 필요하다는 점에 유의해야 합니다. 또한)

ALTER TABLE `student` DROP `temp_entry_date`;
로그인 후 복사

위 내용은 MySQL의 타임스탬프 2038 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MySQL : 쉽게 학습하기위한 간단한 개념 MySQL : 쉽게 학습하기위한 간단한 개념 Apr 10, 2025 am 09:29 AM

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

phpmyadmin을 여는 방법 phpmyadmin을 여는 방법 Apr 10, 2025 pm 10:51 PM

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

Navicat Premium을 만드는 방법 Navicat Premium을 만드는 방법 Apr 09, 2025 am 07:09 AM

Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오.

MySQL 및 SQL : 개발자를위한 필수 기술 MySQL 및 SQL : 개발자를위한 필수 기술 Apr 10, 2025 am 09:30 AM

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

Navicat에서 MySQL에 새로운 연결을 만드는 방법 Navicat에서 MySQL에 새로운 연결을 만드는 방법 Apr 09, 2025 am 07:21 AM

응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오.

SQL이 행을 삭제 한 후 데이터를 복구하는 방법 SQL이 행을 삭제 한 후 데이터를 복구하는 방법 Apr 09, 2025 pm 12:21 PM

백업 또는 트랜잭션 롤백 메커니즘이없는 한 데이터베이스에서 직접 삭제 된 행 복구는 일반적으로 불가능합니다. 키 포인트 : 거래 롤백 : 트랜잭션이 데이터를 복구하기 전에 롤백을 실행합니다. 백업 : 데이터베이스의 일반 백업을 사용하여 데이터를 신속하게 복원 할 수 있습니다. 데이터베이스 스냅 샷 : 데이터베이스의 읽기 전용 사본을 작성하고 데이터를 실수로 삭제 한 후 데이터를 복원 할 수 있습니다. 주의해서 삭제 명령문을 사용하십시오. 실수로 데이터를 삭제하지 않도록 조건을주의 깊게 점검하십시오. WHERE 절을 사용하십시오 : 삭제할 데이터를 명시 적으로 지정하십시오. 테스트 환경 사용 : 삭제 작업을 수행하기 전에 테스트하십시오.

단일 스레드 레 디스를 사용하는 방법 단일 스레드 레 디스를 사용하는 방법 Apr 10, 2025 pm 07:12 PM

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

phpmyadmin 연결 MySQL phpmyadmin 연결 MySQL Apr 10, 2025 pm 10:57 PM

phpmyadmin을 사용하여 MySQL에 연결하는 방법? phpmyadmin에 액세스하기위한 URL은 일반적으로 http : // localhost/phpmyadmin 또는 http : // [서버 IP 주소]/phpmyadmin입니다. MySQL 사용자 이름 및 비밀번호를 입력하십시오. 연결하려는 데이터베이스를 선택하십시오. "연결"버튼을 클릭하여 연결을 설정하십시오.

See all articles