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

推薦する

Linuxにグラフィカルインターフェースをインストールする方法

1. Linuxのインストール(rootユーザー操作) 1. vncserver をインストールしま...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

MySQLデータベースの圧縮バージョンのインストールと設定に関する詳細なチュートリアル

目次1. MySQLをダウンロードする2. 圧縮パッケージを解凍する3. MySQLを初期化する4....

Ubuntu20.04 VNCのインストールと設定の実装

VNC はリモート デスクトップ プロトコルです。 VNC を使用して Ubuntu 20.04 を...

CentOS 7.2 に SuPHP をインストールするための詳細な手順

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

Dockerコンテナに入る方法と出る方法

1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...

MySQL 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

このエラーは初心者によく発生します。この記事では主に、エラー 2003 (HY000): '...

SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決策

目次ブラウザ同一生成元ポリシー1. VUEフロントエンド構成プロキシはクロスドメインの問題を解決しま...

動的な色切り替えの実装コードをサポートするために、CSS で SVG 画像を参照します。

表示する svg 画像を追加すると、React はファイルが見つからないというメッセージを表示します...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

JS におけるメモリと変数の保存についての詳細な説明

目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...

MySQLクエリのパフォーマンスを分析する方法

目次スロークエリの基礎: データ取得の最適化データベースから不要なデータが要求されていないか確認する...

IIS7 IIS8 リバースプロキシルールの記述、インストール、構成方法

目的: ステーションAをステーションBのセカンダリディレクトリとして扱うのように: http://w...

JS ES6における構造化分解についてお話しましょう

概要es6 では、配列またはオブジェクトから指定された要素を取得する新しい方法が追加されました。これ...

MySQL/MariaDB ルートパスワードリセットチュートリアル

序文パスワードを忘れることは、よく遭遇する問題です。MySQL または MariaDB データベース...