ホームページ  >  記事  >  データベース  >  mysqlでタイムスタンプの精度を使用する方法

mysqlでタイムスタンプの精度を使用する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-05-24 09:58:512097ブラウズ

この記事では、mysql での 1901 タイムスタンプ精度の使用法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

mysqlでタイムスタンプの精度を使用する方法

mysql の DATETIME 精度が秒のみをサポートするのはなぜですか?

mysql の DATETIME 型はタイムゾーンに関連していますか?

mysql でテーブルを設計するとき、時間を表すフィールドはどのように選択すればよいでしょうか?

ケース分析の日時精度の問題

少し前に、担当アプリケーションの mysql-connector-java のバージョンが 5.1.16 から 5.1.30 にアップグレードされました。機能回帰。上記の SQL と同様のユースケースの実行時データが欠落し、機能上の問題が発生します。

私が担当しているアプリケーションには、次のような SQL の使用を必要とする機能があります。つまり、タイムスタンプをクエリ条件として使用して、特定のタイムスタンプ以降のすべてのデータをクエリする関数があります。

mysqlでタイムスタンプの精度を使用する方法

調査の結果、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 に変更します;

マッパー インターフェイスに渡す前に、受信タイムスタンプを秒単位で切り上げます。コードは次のとおりです。

mysqlでタイムスタンプの精度を使用する方法

##クエリを実行する前に、受信タイムスタンプを 1 秒ずつ減分します。

解決策 1 では、java.util.Date から転送された java.sql.Date オブジェクトが日付以降の精度をすべて失い、より多くの不必要なデータがクエリされることが確認されています。解決策 3 の可能性があります。ただし、さらに 1 つまたは 2 つのデータが見つかる可能性があります。オプション 2 も可能で、これはコードの観点から mysql-connector-java の特性を補うことに相当します。結局、私は選択肢2を選びました。

ケースの再現

homebrew を使用して MySQL をインストールします。バージョンは 8.0.15 です。インストール後、ユーザー情報を保存するテーブルを作成します。SQL は次のとおりです:

mysqlでタイムスタンプの精度を使用する方法

開発フレームワークとして spirngboot mybatis を使用してユーザー エンティティを定義します。コードは次のとおりです:

mysqlでタイムスタンプの精度を使用する方法

エンティティに対応するマッパーを定義します。

mysqlでタイムスタンプの精度を使用する方法

mysql への接続に関連する構成を設定します。コードは次のとおりです:

mysqlでタイムスタンプの精度を使用する方法

テスト コードを作成し、最初にデータを挿入し、タイムスタンプをクエリ条件として使用します。コードは次のとおりです。

mysqlでタイムスタンプの精度を使用する方法

コードを変更し、上記のコードを使用してクエリのタイムスタンプを秒単位で修正します。コードは次のとおりです。

mysqlでタイムスタンプの精度を使用する方法

シングルを再度実行します。想像どおり、今度はデータをクエリできることをテストします。

ただし、ちょっとしたエピソードがあります。私が最初にテーブルを設計したときに使用した SQL ステートメントは次のとおりでした。

mysqlでタイムスタンプの精度を使用する方法

Smart as you are Youここでの datetime は、小数点以下のより小さな時間精度をすでにサポートしていることに気づいたに違いありません。最大 6 桁、つまり、顕微鏡レベルまでサポートできます。この機能はいつ導入されましたか? [MySQL の公式ドキュメント][9] を確認したところ、この機能は mysql 5.6.4 以降でサポートされていることがわかりました。

mysqlでタイムスタンプの精度を使用する方法

ナレッジポイントのまとめ

前回の実際のケース分析とケースの再発の後、読者は mysql の DATETIME 型についてある程度の理解を持っている必要があります。次に、このケースからどのような経験を要約できるかを見てみましょう。

mysql-connector-java のバージョンと mysql のバージョンを一緒に使用する必要があります。たとえば、5.6.4 より前のバージョンの場合、mysql-connector の 5.1.23 より前のバージョンは使用しないことをお勧めします。 -java、そうでない場合は、今回発生した問題が発生する可能性があります。

MySQL で時間を表すために使用されるフィールド タイプは、DATE、DATETIME、および TIMESTAMP です。これらには類似点があり、それぞれに独自の特性があります。次の表にまとめました:

mysqlでタイムスタンプの精度を使用する方法

DATETIME 型は、MySQL では「YYYYMMDDHHMMSS」形式の整数として保存されます。タイム ゾーンとは関係がなく、8 バイトのスペースを使用します。

TIMESTAMP 型は、時間範囲は非常に小さく、表示される値はタイム ゾーンによって異なります。MySQL サーバー、オペレーティング システム、およびクライアント接続にはすべてタイム ゾーン設定があります。

一般に、タイムスタンプ フィールドとして DATETIME を使用することをお勧めします。時刻を格納するために bigint 型を使用することは推奨されません。

開発中は、タイムスタンプをクエリ条件として使用することは避け、使用する必要がある場合は、MySQL の精度とクエリ パラメータの精度を十分に考慮する必要があります。

推奨学習: php ビデオ チュートリアル

以上がmysqlでタイムスタンプの精度を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。