MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思っていました。
私は業務でLaravelフレームワークを使用しており、組み込みのMigrationでもtimestamp型のフィールドを使用しているため、あまり気にしていません。

始める

現在のデータベースのタイムゾーンを表示する

mysql> "%time_zone%"のような変数を表示します。
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | +08:00 |
+------------------+--------+
セット2列(0.30秒)

テーブル構造を表示

mysql> desc timestamp_test;
+--------------+-----------+------+-----+---------+----------------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+--------------+-----------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| created_time | datetime | YES | | NULL | |
| created_at | タイムスタンプ | YES | | NULL | |
+--------------+-----------+------+-----+---------+----------------+
3 列セット (0.26 秒)

データの挿入

mysql> timestamp_test(created_time, created_at) に値('2020-12-09 08:00:00', '2020-12-09 08:00:00') を挿入します。
クエリは正常、1 行が影響を受けました (0.22 秒)


mysql> timestamp_test から * を選択します。
+----+---------------------+---------------------+
| id | 作成日時 | 作成日時 |
+----+---------------------+---------------------+
| 1 | 2020-12-09 08:00:00 | 2020-12-09 08:00:00 |
+----+---------------------+---------------------+
セット内の1行(0.06秒)

今回は正しいようなので、タイムゾーンを変更して再度データを挿入してみます。

mysql> タイムゾーンを "+00:00" に設定します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)

mysql> timestamp_test(created_time, created_at) に値('2020-12-09 08:00:00', '2020-12-09 08:00:00') を挿入します。
クエリは正常、1 行が影響を受けました (0.03 秒)

mysql> タイムゾーンを "+08:00" に設定します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)

もう一度データを確認してください。挿入された 2 つのSQLは同じですが、クエリの結果は異なります。2 つのデータ間のcreated_atの違いは、まさにタイムゾーンの時間差です。

mysql> timestamp_test から * を選択します。
+----+---------------------+---------------------+
| id | 作成日時 | 作成日時 |
+----+---------------------+---------------------+
| 1 | 2020-12-09 08:00:00 | 2020-12-09 08:00:00 |
| 2 | 2020-12-09 08:00:00 | 2020-12-09 16:00:00 |
+----+---------------------+---------------------+
セットに2行(0.06秒)

実際に保存されたタイムスタンプを見てみましょう。次に、タイムゾーンを変更すると、フィールドの時間は変更されていますが、元のタイムスタンプのデータは変更されていないことがわかります。

mysql> timestamp_test から unix_timestamp(created_at) を * として選択します。
+----+---------------------+---------------------+----------------------------+
| id | created_time | created_at | unix_timestamp(created_at) |
+----+---------------------+---------------------+----------------------------+
| 1 | 2020-12-09 08:00:00 | 2020-12-09 08:00:00 | 1607472000 |
| 2 | 2020-12-09 08:00:00 | 2020-12-09 16:00:00 | 1607500800 |
+----+---------------------+---------------------+----------------------------+
セットに2行(0.06秒)

mysql> タイムゾーンを "+00:00" に設定します。
クエリは正常、影響を受けた行は 0 行 (0.09 秒)

mysql> "%time_zone%"のような変数を表示します。
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | +00:00 |
+------------------+--------+
セットに2行(0.08秒)

mysql> timestamp_test から unix_timestamp(created_at) を * として選択します。
+----+---------------------+---------------------+----------------------------+
| id | created_time | created_at | unix_timestamp(created_at) |
+----+---------------------+---------------------+----------------------------+
| 1 | 2020-12-09 08:00:00 | 2020-12-09 00:00:00 | 1607472000 |
| 2 | 2020-12-09 08:00:00 | 2020-12-09 08:00:00 | 1607500800 |
+----+---------------------+---------------------+----------------------------+
セット2行(0.18秒)

MySQLこれらすべてを暗黙的に変換するので、タイムゾーンの問題を心配する必要はありません。

データベースは実際には UTC タイムスタンプを保存します。書き込み時には、まずセッション タイム ゾーンに従って UTC 時間に変換されます。読み取り時には、セッション タイム ゾーンに従って現在のタイム ゾーンに変換されます。これらの変換は透過的です。

  • 2020-12-09 08:00:00データを正の8分の1ゾーンに保存するとします。
  • このデータは第8ゾーンで取得されましたが、時刻はまだ2020-12-09 08:00:00
  • 現時点では、ゼロタイムゾーンにサーバーがあり、 MySQLに接続し、現在の接続のタイムゾーンを+00:00に設定しています。次に、データベースレコードを確認すると、見つかったデータは2020-12-09 00:00:00で、ゼロタイムゾーンの時間に対応しています。このように、タイムゾーンの問題を考慮する必要はありません。

上記は、MySQL タイムスタンプがタイムゾーンの問題を無視できる理由の詳細です。タイムゾーンを無視する MySQL タイムスタンプの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL の遅いクエリの落とし穴
  • mysql datetimeクエリの異常を解決する
  • タイムスタンプの差を計算するSQLメソッド
  • MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

<<:  HTML Webページの例を使用してヘッドエリアコードの意味を説明する

>>:  Dockerはコンテナに入るためにnsenterツールを使用する

推薦する

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭...

Windows 上の MySQL バージョン 5.7 でエンコードを UTF-8 に変更する方法

序文MySQLの勉強を始めたばかりで、公式サイトから最新バージョン5.7.14をダウンロードしました...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

MySQL 8.0.11 圧縮版のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0圧縮パッケージのインストール方法、詳細は次のとおりです知らせ:オペレーティング シ...

element-ui 写真をアップロードした後、座標点をマークします

要素UIとはelement-ui は、Ele.me のフロントエンド チームが開発者、デザイナー、製...

MySQL 構成マスタースレーブサーバー (マスター 1 台とスレーブ複数台)

目次アイデアホスト構成confを変更する再起動テストスレーブ 1 の構成スレーブ2の構成マスターとス...

WeChatアプレット認証ログインを処理するエレガントな方法

序文WeChat ミニプログラム プロジェクトでユーザー情報を取得し、ユーザー ログインを実装する場...

thead、tfoot、tbodyを使用して表を作成します

これらの 3 つのタグを間違った方法で使用して、タイトルを表に沿わせたり、tbody の高さを固定し...

ウェブ音楽プレーヤーを実現する js

この記事では、参考までに簡単なHTMLと音楽プレーヤーの制作コードを紹介します。具体的な内容は以下の...

Linuxシステムの入出力管理とvimの共通機能の詳細な説明

####システム内の入出力の管理#### 1. システムの入力と出力のリダイレクトを理解する入力リダ...

HttpとHttpsの両方をサポートするNginxの詳細な設定

最近の Web サイトでは Https をサポートすることがほぼ標準機能となっており、Nginx は...

Reactにおける不変値の説明

目次不変の値とは何ですか?不変の値を使用するのはなぜですか? Reactのパフォーマンス最適化は不変...

Explainキーワードに基づいてMySQLインデックス機能を最適化する方法

EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合す...

MySQLデータベースの共通操作スキルのまとめ

この記事では、MySQL データベースの一般的な操作テクニックをまとめます。ご参考までに、詳細は以下...

フロントエンドが習得すべき、複数列の等高レイアウトを実現するための CSS テクニック

1. はじめにページを作成しているときに、複数列のレイアウトに遭遇することがあります。各列の内容が異...