この記事では、mysql での 1901 タイムスタンプ精度の使用法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
mysql の DATETIME 精度が秒のみをサポートするのはなぜですか?
mysql の DATETIME 型はタイムゾーンに関連していますか?
mysql でテーブルを設計するとき、時間を表すフィールドはどのように選択すればよいでしょうか?
ケース分析の日時精度の問題
少し前に、担当アプリケーションの 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 の観点からはバグが修正されますが、私のアプリケーションではバグがトリガーされます。
この問題に直面した場合、どうやって解決しますか?
当時私たちは 3 つのオプションを考えました:
mybatis の Mapper インターフェイスのタイムスタンプ パラメータのタイプを java.util.Date から java.sql.Date に変更します;
マッパー インターフェイスに渡す前に、受信タイムスタンプを秒単位で切り上げます。コードは次のとおりです。
##クエリを実行する前に、受信タイムスタンプを 1 秒ずつ減分します。 解決策 1 では、java.util.Date から転送された java.sql.Date オブジェクトが日付以降の精度をすべて失い、より多くの不必要なデータがクエリされることが確認されています。解決策 3 の可能性があります。ただし、さらに 1 つまたは 2 つのデータが見つかる可能性があります。オプション 2 も可能で、これはコードの観点から mysql-connector-java の特性を補うことに相当します。結局、私は選択肢2を選びました。 ケースの再現homebrew を使用して MySQL をインストールします。バージョンは 8.0.15 です。インストール後、ユーザー情報を保存するテーブルを作成します。SQL は次のとおりです: 開発フレームワークとして spirngboot mybatis を使用してユーザー エンティティを定義します。コードは次のとおりです: エンティティに対応するマッパーを定義します。 mysql への接続に関連する構成を設定します。コードは次のとおりです: テスト コードを作成し、最初にデータを挿入し、タイムスタンプをクエリ条件として使用します。コードは次のとおりです。 コードを変更し、上記のコードを使用してクエリのタイムスタンプを秒単位で修正します。コードは次のとおりです。 シングルを再度実行します。想像どおり、今度はデータをクエリできることをテストします。 ただし、ちょっとしたエピソードがあります。私が最初にテーブルを設計したときに使用した SQL ステートメントは次のとおりでした。 Smart as you are Youここでの datetime は、小数点以下のより小さな時間精度をすでにサポートしていることに気づいたに違いありません。最大 6 桁、つまり、顕微鏡レベルまでサポートできます。この機能はいつ導入されましたか? [MySQL の公式ドキュメント][9] を確認したところ、この機能は mysql 5.6.4 以降でサポートされていることがわかりました。 ナレッジポイントのまとめ前回の実際のケース分析とケースの再発の後、読者は mysql の DATETIME 型についてある程度の理解を持っている必要があります。次に、このケースからどのような経験を要約できるかを見てみましょう。
mysql-connector-java のバージョンと mysql のバージョンを一緒に使用する必要があります。たとえば、5.6.4 より前のバージョンの場合、mysql-connector の 5.1.23 より前のバージョンは使用しないことをお勧めします。 -java、そうでない場合は、今回発生した問題が発生する可能性があります。
MySQL で時間を表すために使用されるフィールド タイプは、DATE、DATETIME、および TIMESTAMP です。これらには類似点があり、それぞれに独自の特性があります。次の表にまとめました:
DATETIME 型は、MySQL では「YYYYMMDDHHMMSS」形式の整数として保存されます。タイム ゾーンとは関係がなく、8 バイトのスペースを使用します。
TIMESTAMP 型は、時間範囲は非常に小さく、表示される値はタイム ゾーンによって異なります。MySQL サーバー、オペレーティング システム、およびクライアント接続にはすべてタイム ゾーン設定があります。
一般に、タイムスタンプ フィールドとして DATETIME を使用することをお勧めします。時刻を格納するために bigint 型を使用することは推奨されません。
開発中は、タイムスタンプをクエリ条件として使用することは避け、使用する必要がある場合は、MySQL の精度とクエリ パラメータの精度を十分に考慮する必要があります。
推奨学習: php ビデオ チュートリアル
以上がmysqlでタイムスタンプの精度を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。