집 >데이터 베이스 >MySQL 튜토리얼 >mysql에서 타임스탬프 정밀도를 사용하는 방법
이 글에서는 mysql에서 1901 타임스탬프 정밀도의 사용법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
mysql의 DATETIME 정밀도가 초만 지원하는 이유는 무엇입니까?
mysql의 DATETIME 유형이 시간대와 관련이 있나요?
MySQL에서 테이블을 디자인할 때 시간을 나타내는 필드를 어떻게 선택하나요?
DATETIME 정확도 문제 사례 분석
얼마 전 담당 애플리케이션의 mysql-connector-java 버전이 5.1.16에서 5.1.30으로 업그레이드 되었는데, 함수 회귀 분석을 해보니 SQL과 유사한 것으로 나타났습니다. 위의 내용이 사용되었습니다. 사용 사례의 런타임 데이터에 누락이 있어 기능적 문제가 발생할 수 있습니다.
제가 담당하고 있는 애플리케이션에는 타임스탬프를 쿼리 조건으로 사용하여 특정 타임스탬프 이후의 모든 데이터를 쿼리하는 다음과 유사한 SQL 사용이 필요한 함수가 있습니다.
조사 결과, mysql-connector-java는 5.1.23 이전 몇 초 후에 정밀도를 폐기한 다음 이를 MySQL 서버에 전달하는 것으로 나타났습니다. mysql 버전에서는 DATETIME의 정밀도가 발생했습니다. mysql을 추가한 후 -connector-java를 5.1.30으로 업그레이드한 후, mysql-connector-java를 통해 java 애플리케이션에서 MySQL 서버로 타임스탬프가 전송될 때 밀리초는 삭제되지 않습니다. mysql-connector-java의 관점에서 수정했습니다. BUG가 발견되었지만 내 애플리케이션에서는 BUG가 발생했습니다.
이 문제에 직면하면 어떻게 해결하시겠습니까?
당시 우리는 세 가지 옵션을 생각했습니다.
mybatis의 Mapper 인터페이스에서 타임스탬프 매개변수 유형을 java.util.Date에서 java.sql.Date로 변경합니다.
Mapper 인터페이스에 전달하기 전에 이를 전달합니다. in 수신 타임스탬프는 초 단위로 수정됩니다. 코드는 다음과 같습니다
쿼리하기 전에 수신 타임스탬프를 1초 줄입니다.
확인 후 옵션 1은 java.util.Date를 java.sql로 전송합니다. 날짜 객체는 날짜 이후의 모든 정밀도를 삭제하므로 불필요한 데이터가 더 많이 쿼리됩니다. 옵션 3도 가능하지만 하나 또는 두 개의 데이터를 더 찾을 수도 있습니다. 이는 보상이 있는 코드에서 시작하는 것과 같습니다. mysql-connector-java의 기능을 위해 만들어졌습니다. 결국 나는 옵션 2를 선택했다.
Case recurrence
homebrew를 사용하여 MySQL을 설치합니다. 버전은 8.0.15입니다. 설치 후 SQL은 다음과 같습니다.
spirngboot + mybatis를 개발 프레임워크로 사용합니다. 사용자 엔터티를 정의하면 코드는 다음과 같습니다.
엔터티에 해당하는 Mapper를 정의하면 코드는 다음과 같습니다.
mysql 연결과 관련된 구성을 설정하면 코드는 다음과 같습니다.
테스트 코드를 작성하고 먼저 데이터 조각을 삽입한 다음 쿼리 조건으로 타임스탬프를 사용합니다. 코드는 다음과 같습니다.
우리가 상상한 대로 단일 테스트를 실행합니다. 데이터를 쿼리한 결과는 다음과 같습니다.
코드를 수정하여 위의 코드를 사용합니다. 코드는 다음과 같습니다.
단일 테스트를 다시 실행합니다. 이번에는 데이터를 쿼리할 수 있다고 상상했습니다.
그러나 여기에 작은 에피소드가 있습니다. 제가 처음 테이블을 디자인했을 때 사용한 SQL 문은 다음과 같습니다.
당신이 똑똑하다면 여기의 날짜 시간이 이미 더 작은 소수 자릿수를 지원한다는 것을 발견했을 것입니다. 시간 정확도가 향상되어 최대 6자리, 즉 미시적 수준까지 지원됩니다. 이 기능은 언제 도입되었나요? [MySQL 공식 문서][9]를 확인해 보니 이 기능이 mysql 5.6.4 이후에 지원되는 것으로 나타났습니다.
지식 포인트 요약
이전의 실제 사례 분석과 사례 재발을 살펴본 후 독자들은 mysql의 DATETIME 유형에 대해 어느 정도 이해해야 합니다. 다음으로 이 사례를 통해 어떤 경험을 요약할 수 있는지 살펴보겠습니다.
mysql-connector-java 버전과 mysql 버전을 함께 사용해야 합니다. 예를 들어 5.6.4 이전 버전이라면 5.1 이전 버전의 mysql-connector-java는 사용하지 않는 것이 가장 좋습니다. 23, 그렇지 않으면 이번에 발생한 문제가 발생할 수 있습니다.
MySQL에서 시간을 표현하는 데 사용되는 필드 유형은 DATE, DATETIME 및 TIMESTAMP입니다. 이들은 유사성을 가지며 각각 고유한 특성을 가지고 있습니다.
DATETIME 유형은 MySQL에서 정수입니다. "YYYYMMDDHHMMSS" 형식으로 저장되며, 이는 시간대와 관련이 없으며 8바이트의 공간을 사용합니다.
TIMESTAMP 유형은 훨씬 더 작은 시간 범위를 저장할 수 있으며 표시되는 값은 시간대, MySQL 서버, 운영 체제 및 클라이언트 연결에는 시간대 설정이 있습니다.
일반적으로 타임스탬프 필드로 DATETIME을 사용하는 것이 좋으며, 시간을 저장하기 위해 bigint 유형을 사용하는 것은 권장되지 않습니다.
개발 시 타임스탬프를 쿼리 조건으로 사용하지 않도록 해야 하며, 꼭 사용해야 한다면 MySQL의 정확성과 쿼리 매개변수의 정확성을 충분히 고려해야 합니다.
추천 학습: php 비디오 튜토리얼
위 내용은 mysql에서 타임스탬프 정밀도를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!