Eine ausführliche Zusammenfassung der Überlegungen zu MySQL-Zeiteinstellungen

Eine ausführliche Zusammenfassung der Überlegungen zu MySQL-Zeiteinstellungen

Existiert die Zeit wirklich? Manche Menschen glauben, dass Zeit lediglich ein vom Menschen erdachtes Konzept und ein Maßstab zur Messung der Veränderung von Dingen sei. Bei Datenbanken geht die Zeit Hand in Hand mit den Daten. Betreten Sie den MySQL-Zeitstrudel.

1. Zeittypfelder

MySQL-Zeittypfeld:

Folgendes wird leicht übersehen:

TIMESTAMP speichert Daten folgendermaßen:

MySQL konvertiert TIMESTAMP-Werte zum Speichern von der aktuellen Zeitzone in UTC und zum Abrufen von UTC zurück in die aktuelle Zeitzone.
(Dies gilt nicht für andere Typen, wie etwa DATETIME.) Standardmäßig ist die aktuelle Zeitzone für jede Verbindung die Zeit des Servers. Die Zeitzone kann für jede Verbindung einzeln eingestellt werden. Solange die Zeitzoneneinstellung gleich bleibt, wird derselbe gespeicherte Wert zurückgegeben. Wenn Sie einen Zeitstempelwert speichern, dann die Zeitzone ändern und den Wert abrufen, unterscheidet sich der abgerufene Wert vom gespeicherten Wert. Dies liegt daran, dass die Umrechnung nicht in beide Richtungen mit der gleichen Zeitzone erfolgt. Die aktuelle Zeitzone ist als Wert der Systemvariable time_zone verfügbar.

TIMESTAMP und SQL_MODE Kombination

sql_mode wirkt sich auch auf den Zeitstempelwert aus:

mysql> TABELLE ERSTELLEN ts (
         id INTEGER NICHT NULL AUTO_INCREMENT PRIMARY KEY,
         Spalte TIMESTAMP NICHT NULL
     ) AUTO_INCREMENT = 1;

mysql> VARIABLEN WIE '%sql_mode%' ANZEIGEN;
+------------------+---------------------+
| Variablenname | Wert |
+------------------+---------------------+
| SQL-Modus | STRICT_TRANS_TABLES |
+------------------+---------------------+
mysql> INSERT INTO ts (Spalte) VALUES ('1969-01-01 01:01:10');
FEHLER 1292 (22007): Falscher Datums-/Uhrzeitwert: „1969-01-01 01:01:10“ für Spalte „col“ in Zeile 1

mysql> SETze sql_mode="";
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
mysql> VARIABLEN WIE '%sql_mode%' ANZEIGEN;
+---------------+-------+
| Variablenname | Wert |
+---------------+-------+
| SQL-Modus | |
+---------------+-------+
mysql> INSERT INTO ts (Spalte) VALUES ('1969-01-01 01:01:10'), ('2999-01-01 01:01:10');
Abfrage OK, 2 Zeilen betroffen, 2 Warnungen (0,01 Sek.)
Datensätze: 2 Duplikate: 0 Warnungen: 2
mysql> Warnungen anzeigen;
+---------+------+------------------------------------------+
| Ebene | Code | Nachricht |
+---------+------+------------------------------------------+
| Warnung | 1264 | Wert für Spalte „col“ in Zeile 1 außerhalb des Bereichs |
| Warnung | 1264 | Wert für Spalte „col“ in Zeile 2 außerhalb des Bereichs |
+---------+------+------------------------------------------+

mysql> AUSWÄHLEN * VON TS;
+----+---------------------+
| Ich würde | Spalte |
+----+---------------------+
| 1 | 0000-00-00 00:00:00 |
| 2 | 0000-00-00 00:00:00 |
+----+---------------------+
2 Zeilen im Satz (0,00 Sek.)

Durch die Steuerung des SQL-Modus werden Werte, die das Zeitstempellimit überschreiten, zwar weiterhin eingefügt, allerdings wird die Methode zum Auffüllen von Leerzeichen mit 0 übernommen.
Bei STRICT_TRANS_TABLES konvertiert MySQL einen ungültigen Wert in den nächstgelegenen gültigen Wert und fügt dann den angepassten Wert ein. Wenn ein Wert fehlt, fügt MySQL den impliziten Standardwert für den Spaltendatentyp ein.

2. expliziter_defaults_for_timestamp-Zeitverarbeitungsmechanismus

Die Standardeinstellung ist „Aktiviert“.

Ab MySQL 8.0.22 wird jeder Versuch, NULL in eine als TIMESTAMP NOT NULL deklarierte Spalte einzufügen, mit einem Fehler abgelehnt.

1. Wenn explicit_defaults_for_timestamp deaktiviert ist:

  • Eine Zeitstempelspalte, die nicht explizit mit dem NULL-Attribut deklariert ist, wird automatisch mit dem NOT NULL-Attribut deklariert. Die Zuweisung von NULL zu einer solchen Spalte ist zulässig und setzt die Spalte auf den aktuellen Zeitstempel. Ab MySQL 8.0.22 wird jeder Versuch, NULL in eine als TIMESTAMP NOT NULL deklarierte Spalte einzufügen, mit einem Fehler abgelehnt.
  • Wenn die erste Spalte in einer Tabelle nicht mit dem NULL-Attribut oder mit einem expliziten DEFAULT- oder ON UPDATE-Attribut deklariert ist, wird sie automatisch mit dem Standardattribut CURRENT_TIMESTAMP und dem ON UPDATE CURRENT_TIMESTAMP-Attribut deklariert.
  • TIMESTAMP wird automatisch mit einem Standardwert von „0000-00-00 00:00:00“ (dem „Null“-Zeitstempel) deklariert, wenn es nicht explizit mit dem NULL-Attribut oder einem expliziten Standardattribut deklariert wird.
  • Der Standardwert „0000-00-00 00:00:00“ ist möglicherweise ungültig, je nachdem, ob der strikte SQL-Modus oder der SQL-Modus NO_ZERO_DATE aktiviert ist.

2. explicit_defaults_for_timestamp ist aktiviert:

  • Es ist nicht möglich, für TIMESTAMP einen NULL-Wert anzugeben, um ihn auf den aktuellen Zeitstempel festzulegen. Um den aktuellen Zeitstempel anzugeben, legen Sie CURRENT_TIMESTAMP oder ein Synonym wie NOW() fest.
  • Eine TIMESTAMP-Spalte, die nicht explizit mit dem Attribut „not NULL“ deklariert ist, wird automatisch mit dem Attribut „NULL“ deklariert und lässt Nullwerte zu.
  • Eine mit dem Attribut NOT NULL deklarierte Zeitstempelspalte lässt keine Nullwerte zu. Einfügungen, die NULL für eine solche Spalte angeben, führen bei einer Einfügung in eine einzelne Zeile zu einem Fehler, wenn der strikte SQL-Modus aktiviert ist, oder zu '0000-00-00 00:00:00' bei einer Einfügung in mehrere Zeilen, wenn der strikte SQL-Modus deaktiviert ist. In jedem Fall führt die Zuweisung des Werts NULL zu einer Spalte nicht dazu, dass diese auf den aktuellen Zeitstempel gesetzt wird.
  • Eine Zeitstempelspalte, die explizit mit dem Attribut NOT NULL deklariert ist und kein explizites Standardattribut hat, wird so behandelt, als hätte sie keinen Standardwert. Bei eingefügten Zeilen, die keine expliziten Werte für solche Spalten angeben, hängen die Ergebnisse vom SQL-Modus ab. Wenn der strikte SQL-Modus aktiviert ist, führt dies zu einem Fehler. Wenn der strikte SQL-Modus nicht aktiviert ist, wird die Spalte mit dem impliziten Standardwert „0000-00-00 00:00:00“ deklariert und eine Warnung wird angezeigt.
  • Spalten vom Typ „Zeitstempel“ werden nicht automatisch mit dem Standardattribut CURRENT_TIMESTAMP oder mit einem aktualisierten Attribut CURRENT_TIMESTAMP deklariert. Diese Eigenschaften müssen explizit angegeben werden.

prüfen:

TABELLE ERSTELLEN `test1`(
id bigint nicht null AUTO_INCREMENT COMMENT 'Primärschlüssel-ID', 
Name varchar(20) COMMENT 'Primärschlüssel-ID',
create_time TIMESTAMP NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'cr time',
PRIMÄRSCHLÜSSEL(id)
)ENGINE=InnoDB AUTO_INCREMENT=1 ;
VARIABLEN WIE „explicit_defaults_for_timestamp“ ANZEIGEN;
GLOBAL explizite_Vorgaben für_Zeitstempel festlegen=ON;
GLOBAL explizite_Vorgaben für_Zeitstempel festlegen=AUS;
INSERT INTO test1(id,name,erstellungszeit) VALUES(1,'Kit',NULL);

3. MySQL-Systemkonfiguration

Zu den systembezogenen Ereignisparametern gehören 3:

mysql>globale Variablen anzeigen, bei denen der Variablenname wie „%time_zone%“ oder der Variablenname wie „log_timestamp%“ ist;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| Systemzeitzone | CST |
| Zeitzone | SYSTEM |
| log_zeitstempel | UTC |
+------------------+--------+
3 Zeilen im Satz (0,00 Sek.)

1. Systemzeitzone: Beim Start des Servers versucht dieser automatisch die Zeitzone des Hosts zu ermitteln und verwendet diese zum Einstellen der Systemvariable system_time_zone. Der Wert ändert sich danach nicht mehr.

2.time_zone: Die vollständige time_zone gibt die Zeitzone an, in der der Server derzeit läuft. Der anfängliche Zeitzonenwert ist „SYSTEM“, was bedeutet, dass die Server-Zeitzone mit der System-Zeitzone übereinstimmt.

  • Wenn der Wert auf SYSTEM gesetzt ist, rufen MySQL-Funktionsaufrufe eine Systembibliothek auf, um die aktuelle Systemzeitzone zu bestimmen. Dieser Aufruf ist möglicherweise durch ein globales Mutex geschützt, was zu Konflikten führt. Problem: Hohe CPU-Auslastung.
  • Das Festlegen der Sitzungszeitzone wirkt sich auf die Anzeige und Speicherung zeitzonenabhängiger Zeitwerte aus. Hierzu zählen Werte, die von Funktionen wie NOW() oder CURTIME() angezeigt werden, sowie Werte, die in Zeitstempelspalten gespeichert und aus diesen abgerufen werden. Werte von Zeitstempelspalten werden zum Speichern von der Sitzungszeitzone in UTC und zum Abrufen von UTC in die Sitzungszeitzone konvertiert.
  • Die Einstellung der Sitzungszeitzone hat keinen Einfluss auf die von Funktionen wie UTC_TIMESTAMP() angezeigten Werte oder auf Werte in den Spalten DATE, time oder DATETIME. Werte dieser Datentypen werden zudem nicht in UTC gespeichert, die Zeitzone gilt für sie lediglich bei der Umrechnung von Zeitstempelwerten.

Hinweis: MySQL bietet auch eine Methode zum Importieren von Zeitzonen in die MySQL-Systembibliothek. Verwenden Sie das Programm mysql_tzinfo_to_sql, um die Zeitzoneninformationen in /usr/share/zoneinfom zu laden.

mysql> SELECT COUNT(*) FROM mysql.Zeitzonenname;
+----------+
| ANZAHL(*) |
+----------+
| 0 |
+----------+

##mysql_tzinfo_to_sql-Tool zum Importieren von Zeitzonenwerten

shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql> SELECT COUNT(*) FROM mysql.Zeitzonenname;
+----------+
| ANZAHL(*) |
+----------+
| 1780 |
+----------+

3.log_timestamps

Diese Variable steuert die Zeitzone der Zeitstempel in Nachrichten, die in das Fehlerprotokoll geschrieben werden, sowie in allgemeinen Abfrageprotokollen und langsamen Abfrageprotokollnachrichten, die in Dateien geschrieben werden.

Die Zeitzone, in die die Tabellen „allgemeines Abfrageprotokoll“ und „langsames Abfrageprotokoll“ geschrieben werden (mysql.general_log und mysql.slow_log), wird davon nicht beeinflusst.

Erlaubte log_timestamps-Werte sind UTC (Standard) und SYSTEM (lokale Systemzeitzone)

Hinweis: UTC steht im Allgemeinen für die koordinierte Weltzeit. Die koordinierte Weltzeit, auch bekannt als Welteinheitszeit, Weltstandardzeit, internationale koordinierte Zeit, ist UTC + 8 Stunden = China-Zeit

Natürlich muss der Wert für eine bessere Verwaltung mit der Aufzeichnungszeit des Systems übereinstimmen.

#Stellen Sie die Zeitzone ein und ändern Sie sie in die 8. Ostzone. SET GLOBAL time_zone = '+8:00';   

Anregung:

MySQL-Konfigurationsdatei my.cnf

[mysqld]
log_timestamps=SYSTEM
Standardzeitzone = '+8:00'
mysql>globale Variablen anzeigen, bei denen der Variablenname wie „%time_zone%“ oder der Variablenname wie „log_timestamp%“ ist;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| log_zeitstempel | SYSTEM |
| Systemzeitzone | CST |
| Zeitzone | +08:00 |
+------------------+--------+

Zusammenfassen

Erfahren Sie, wie Sie die Zeit in MySQL anhand von Zeittypen, Parametern und Systemzeitzonen einstellen und verwenden.

Ändern Sie insbesondere den SQL-Modus nicht einfach ohne besondere Anforderungen.

Dies ist das Ende dieses Artikels über Vorsichtsmaßnahmen bei der MySQL-Zeiteinstellung. Weitere relevante Vorsichtsmaßnahmen bei der MySQL-Zeiteinstellung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Analysieren Sie die Methode zum Festlegen der aktuellen Zeit als Standardwert in MySQL
  • mysql legt den Standardzeitwert fest
  • Beispiel zum Festlegen der automatischen Erstellungszeit und Änderungszeit in MySQL

<<:  Perfekte Lösung für das Zeitzonenproblem des Docker Alpine-Image

>>:  Implementierungscode zum Hinzufügen eines Schrägstrichs zum Vue-Elementheaders

Artikel empfehlen

Analyse des Unterschieds zwischen absolutem und relativem Pfad in HTML

Wie in der Abbildung gezeigt: Mit einer einzelnen ...

Beispiele für ES6-Schleifen und iterierbare Objekte

Dieser Artikel untersucht die ES6-for...of-Schlei...

Hinweise zum virtuellen Dateisystem des Linux-Kernel-Gerätetreibers

/******************** * Virtuelles Dateisystem VF...

So installieren Sie die MySQL 8.0-Datenbank auf dem M1-Chip (Bild und Text)

1. Herunterladen Zunächst möchte ich einen inländ...

So stellen Sie Docker-Containerdaten wieder her

Die Datenbankdaten der Projekttestumgebung sind v...

Designtheorie: Textausdruck und Benutzerfreundlichkeit

<br />Beim Textdesign konzentrieren wir uns ...

So verwalten Sie Benutzer und Gruppen beim Ausführen von Docker

Docker ist ein Verwaltungstool, das Prozesse als ...

Detaillierte Erklärung des Lebenszyklus einer Angular-Komponente (I)

Inhaltsverzeichnis Überblick 1. Hook-Aufrufreihen...

Verwenden von js zur Realisierung eines dynamischen Hintergrunds

In diesem Artikelbeispiel wird der spezifische Co...

JS erkennt den Fall der Eliminierung von Sternen

In diesem Artikelbeispiel wird der spezifische JS...