Warum kann MySQL bei der Verwendung von Zeitstempeln Zeitzonenprobleme ignorieren?

Warum kann MySQL bei der Verwendung von Zeitstempeln Zeitzonenprobleme ignorieren?

Ich habe mich immer gefragt, warum der timestamp MySQL Datenbank das Zeitzonenproblem ignorieren kann.
Ich verwende in meinem Unternehmen das Laravel -Framework und die integrierte Migration verwendet auch Felder vom Typ timestamp , daher ist mir das nicht so wichtig.

Start

Anzeigen der aktuellen Datenbank-Zeitzone

mysql> Variablen wie „%time_zone%“ anzeigen;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| Systemzeitzone | CST |
| Zeitzone | +08:00 |
+------------------+--------+
2 Reihen im Satz (0,30 Sek.)

Tabellenstruktur anzeigen

mysql> Beschreibung Zeitstempel_Test;
+--------------+--------------+------+-----+---------+----------------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+--------------+--------------+------+-----+---------+----------------+
| ID | int | NEIN | PRI | NULL | auto_increment |
| Erstellungszeit | Datum/Uhrzeit | JA | | NULL | |
| erstellt am | Zeitstempel | JA | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
3 Reihen im Satz (0,26 Sek.)

Einfügen von Daten

mysql> einfügen in timestamp_test(erstellt_zeit, erstellt_am) Werte('2020-12-09 08:00:00', '2020-12-09 08:00:00');
Abfrage OK, 1 Zeile betroffen (0,22 Sek.)


mysql> wähle * aus Zeitstempel_test;
+----+---------------------+---------------------+
| ID | Erstellungszeit | Erstellungsdatum |
+----+---------------------+---------------------+
| 1 | 09.12.2020 08:00:00 | 09.12.2020 08:00:00 |
+----+---------------------+---------------------+
1 Zeile im Satz (0,06 Sek.)

Diese Zeit scheint korrekt zu sein, also versuchen wir, die Zeitzone zu ändern und die Daten erneut einzugeben.

mysql> SETZE Zeitzone = "+00:00";
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)

mysql> einfügen in timestamp_test(erstellt_zeit, erstellt_am) Werte('2020-12-09 08:00:00', '2020-12-09 08:00:00');
Abfrage OK, 1 Zeile betroffen (0,03 Sek.)

mysql> SETZE Zeitzone = "+08:00";
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)

Überprüfen Sie nun die Daten erneut. Die beiden eingefügten SQL sind gleich, aber die Abfrageergebnisse sind unterschiedlich. Der Unterschied in created_at zwischen den beiden Daten ist genau der Zeitunterschied der Zeitzone.

mysql> wähle * aus Zeitstempel_test;
+----+---------------------+---------------------+
| ID | Erstellungszeit | Erstellungsdatum |
+----+---------------------+---------------------+
| 1 | 09.12.2020 08:00:00 | 09.12.2020 08:00:00 |
| 2 | 09.12.2020 08:00:00 | 09.12.2020 16:00:00 |
+----+---------------------+---------------------+
2 Reihen im Satz (0,06 Sek.)

Schauen wir uns den tatsächlich gespeicherten Zeitstempel an. Dann ändern wir die Zeitzone und stellen fest, dass sich die Feldzeit geändert hat, die ursprünglichen Zeitstempeldaten jedoch nicht geändert haben.

mysql> wähle *, unix_timestamp(erstellt am) aus timestamp_test;
+----+---------------------+---------+-------------------------+
| ID | Erstellungszeit | Erstellungsdatum | Unix-Zeitstempel(Erstellungsdatum) |
+----+---------------------+---------+-------------------------+
| 1 | 09.12.2020 08:00:00 | 09.12.2020 08:00:00 | 1607472000 |
| 2 | 09.12.2020 08:00:00 | 09.12.2020 16:00:00 | 1607500800 |
+----+---------------------+---------+-------------------------+
2 Reihen im Satz (0,06 Sek.)

mysql> SETZE Zeitzone = "+00:00";
Abfrage OK, 0 Zeilen betroffen (0,09 Sek.)

mysql> Variablen wie „%time_zone%“ anzeigen;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| Systemzeitzone | CST |
| Zeitzone | +00:00 |
+------------------+--------+
2 Reihen im Satz (0,08 Sek.)

mysql> wähle *, unix_timestamp(erstellt am) aus timestamp_test;
+----+---------------------+---------+-------------------------+
| ID | Erstellungszeit | Erstellungsdatum | Unix-Zeitstempel(Erstellungsdatum) |
+----+---------------------+---------+-------------------------+
| 1 | 09.12.2020 08:00:00 | 09.12.2020 00:00:00 | 1607472000 |
| 2 | 09.12.2020 08:00:00 | 09.12.2020 08:00:00 | 1607500800 |
+----+---------------------+---------+-------------------------+
2 Reihen im Satz (0,18 Sek.)

Da MySQL all dies implizit für uns konvertiert, müssen wir uns keine Gedanken über Zeitzonenprobleme machen.

Die Datenbank speichert tatsächlich UTC-Zeitstempel. Beim Schreiben wird zunächst entsprechend der Sitzungszeitzone in die UTC-Zeit konvertiert. Beim Lesen wird entsprechend der Sitzungszeitzone in die aktuelle Zeitzone konvertiert. Diese Konvertierungen sind transparent.

  • Angenommen, wir speichern ein Datenelement 2020-12-09 08:00:00 in der positiven Achtelzone
  • Wir haben diese Daten in der achten Zone abgerufen und die Zeit ist immer noch 2020-12-09 08:00:00
  • Zu diesem Zeitpunkt haben wir einen Server in der Zeitzone Null, stellen eine Verbindung zu MySQL her und stellen die Zeitzone der aktuellen Verbindung auf +00:00 ein. Überprüfen Sie dann den Datenbankeintrag und die gefundenen Daten lauten: 2020-12-09 00:00:00 , was der Zeit der Zeitzone Null entspricht. Auf diese Weise müssen wir das Zeitzonenproblem nicht berücksichtigen.

Oben sind die Details, warum MySQL-Zeitstempel das Zeitzonenproblem ignorieren können. Weitere Informationen zum Ignorieren der Zeitzone durch MySQL-Zeitstempel finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Fallstricke bei langsamen MySQL-Abfragen
  • Beheben der Anomalie der MySQL-Datums-/Uhrzeitabfrage
  • SQL-Methode zum Berechnen der Zeitstempeldifferenz
  • Fallstricke und Lösungen bei der MySQL-Zeitstempelvergleichsabfrage

<<:  Erläuterung der Bedeutung des Head-Area-Codes anhand von HTML-Webseitenbeispielen

>>:  Docker verwendet das Tool nsenter, um in den Container zu gelangen

Artikel empfehlen

Super detaillierter GCC-Upgrade-Prozess unter Linux

Inhaltsverzeichnis Vorwort 1. Aktuelle gcc-Versio...

Pull-Down-Aktualisierung und Pull-Up-Ladekomponenten basierend auf Vue-Kapselung

Basierend auf Vue und nativer JavaScript-Kapselun...

Die letzten zwei Jahre mit User Experience

<br />Es ist nicht länger als zwei Jahre her...

Wie oft werden mehrere setStates in React aufgerufen?

Inhaltsverzeichnis 1. Zwei setState, wie oft soll...

Teilen Sie 10 der neuesten Web-Frontend-Frameworks (Übersetzung)

In der Welt der Webentwicklung sind Frameworks wei...

Dynamische Vue-Komponente

Inhaltsverzeichnis 1. Komponente 2. Keep-Alive-Mo...

12 Gesetze des Webdesigns für sauberen Code [Grafik]

Schöner Code ist die Grundlage einer schönen Websi...

Delegieren von Berechtigungen in Linux mit Sudo

Einführung in die Sudo-Autoritätsdelegierung su-S...

Was muss ich tun, wenn ich einen fehlerhaften MySQL-Befehl abbrechen möchte?

Ich habe einen falschen MySQL-Befehl eingegeben u...

Reines CSS zum Ändern der Farbe des Bildes

Die CSS-Technik zum Ändern der Farbe eines Bildes...

Vue verwendet Echarts, um ein dreidimensionales Balkendiagramm zu implementieren

In diesem Artikel wird der spezifische Code von V...

So verleihen Sie einer Website ein höheres und ansprechenderes Aussehen

„Wie lässt man eine Website hochwertig aussehen? ...