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ツールを使用する

推薦する

Squid を使用して http および https 用のプロキシ サーバーを構築する方法

nginx を導入した際に、フォワードプロキシの設定も nginx を使っていました。しかし、htt...

HTML での Li タグの使用例

タイトルを左に、日付を右に揃えたいのですが、日付の範囲に float:right を直接追加すると、...

CentOS7にMySQL 8.0.26をインストールする手順

1. まず、お使いのマシンに応じて、MySQL 公式サイトから対応するデータベースをダウンロードしま...

CentOS 8 に MariaDB をインストールするための詳細なチュートリアル

MariaDB データベース管理システムは MySQL のブランチであり、主にオープンソース コミュ...

js における浅いコピーと深いコピーの詳細な説明

目次1. jsメモリ2. 譲渡3. 浅いコピー4. ディープコピー序文:以下の記事を読む前に、記憶に...

nginxとIISで使用できるSSL証明書を作成する

目次SSL証明書の作成1. 秘密鍵を生成する2. 証明書要求ファイルを生成する3. CRT証明書ファ...

モバイル開発チュートリアル: ピクセル表示の問題の概要

序文モバイル端末の開発の過程で、モバイル端末のディスプレイはデスクトップ端末のディスプレイとは一般的...

Docker での Redis のマスタースレーブ構成チュートリアルの詳細説明

1. Redisイメージを取得するdocker pull redis 2. それぞれポート6379、...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

Facebookの情報アーキテクチャの分析

<br />原文: http://uicom.net/blog/?p=762 Faceb...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

ウェブデザインを改善するための 8 つの CSS ツールを共有する

ウェブサイトのデザインを編集または変更する必要がある場合、CSS が重要な役割を果たします。 CSS...

docker-composeの詳細なインストールと使用方法

Docker Compose は、複雑なアプリケーションを定義および実行するための Docker ツ...

CSS3で作成した画像スクロール効果

成果を達成する実装コードhtml <base href="https://s3-us...