Details zu MySQL-Zeittypen und -Modi

Details zu MySQL-Zeittypen und -Modi

Beim Versuch, einen Zeitstempel in eine MySQL-Datenbank einzufügen, wird folgende Fehlermeldung angezeigt:

mysql> in alarm_service-Werte einfügen (6, '1970-01-01 08:00:00'); 
FEHLER 1292 (22007): Falscher Datums-/Uhrzeitwert: „1970-01-01 08:00:00“ für Spalte „Zeit“ in Zeile 1

# Zeigen Sie die Tabellenstruktur an mysql> show create table alarm_service;
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Tabelle | Tabelle erstellen |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| alarm_service | TABELLE `alarm_service` ERSTELLEN (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `Zeit` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP,
  PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |
+-------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Wir können sehen, dass die Fehlermeldung angibt, dass der Zeitwert falsch ist, aber dies ist offensichtlich ein gültiger Zeitpunkt.

Nach der Suche in den Daten habe ich festgestellt, dass der Grund darin liegt, dass in MySQL das zulässige Intervall timestamp 1970-01-01 00:00:01 - 2038-01-19 03:14:07 UTC, Beim Speichern werden die von Ihnen eingefügten Daten zuerst in die UTC-Zeit konvertiert, dann gespeichert und beim Lesen in Ihre Ortszeit konvertiert. Da meine Zeitzone East 8 ist, ergibt die Umrechnung 1970-01-01 00:00:00 UTC , was eine ungültige Zeit ist.

Die Lösung ist:

  1. Passen Sie die Zeit an den zulässigen Bereich an
  2. Passen Sie den strikten MySQL-Modus an, um unzulässige Zeiten zuzulassen

Nachfolgend erläutern wir Ihnen die entsprechenden Inhalte im Detail.

1. MySQL-Zeittyp

MySQL-Zeittypen werden in drei Typen unterteilt :

  • DATUM: Wenn es nur das Datum, aber nicht die Uhrzeit enthält, konvertiert MySQL das Format in YYYY-MM-DD , und der gültige Bereich ist 1000-01-01 - 9999-12-31 .
  • DATETIME: Wenn es verwendet wird, um Datum + Uhrzeit zu enthalten, ist das Format YYYY-MM-DD HH:MM:SS und der gültige Bereich ist 1000-01-01 00:00:00 - 9999-12-31 23:59:59 .
  • ZEITSTEMPEL: Wenn es verwendet wird, um Datum + Uhrzeit zu enthalten, ist das Format YYYY-MM-DD HH:MM:SS und der gültige Bereich ist 1997-01-01 00:00:01 - 2038-01-19 03:14:07 UTC .

Gleichzeitig unterstützen DATETIME und TIMESTAMP auch 6-stellige Mikrosekundendaten. Das Format ist YYYY-MM-DD HH:MM:SS[.fraction] und der zulässige Bereich ist .000000 - .999999 .

Sowohl DATETIME als auch TIMESTAMP liefern außerdem Daten, die automatisch initialisiert und auf das aktuelle Datum und die aktuelle Uhrzeit aktualisiert werden.

Beim Typ TIMESTAMP konvertiert MySQL den Datenwert beim Speichern in die UTC-Standardzeit und beim Lesen in die aktuelle Zeit. Wenn sich Ihre Zeitzone nicht ändert, ist der Wert der von Ihnen gespeicherte. Wenn Sie die Zeitzone ändern, ändert sich der von Ihnen gelesene Wert. Diese Funktion funktioniert nicht für DATETIME .

2. Überprüfen Sie die Zeitzone

mysql> Variablen wie „%zone%“ anzeigen;                                       
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| Systemzeitzone | CST |
| Zeitzone | SYSTEM |
+------------------+--------+


Sie können sehen, dass die aktuelle Zeitzone SYSTEM ist, was mit dem Betriebssystem übereinstimmt. Die Systemzeitzone ist CST (China Standard Time). Sie können auch sehen, dass die Systemzeit Ost 8 (+0800) ist:

$ Datum -R
Di., 23. April 2019 11:22:47 +0800


Wenn wir also 1970-01-01 08:00:00 eingeben, korrigiert MySQL dies zu 1970-01-01 00:00:00, was ein ungültiger Wert ist.

3. Unzulässiger Zeitwert

Bei unzulässigen Zeitwerten konvertiert MySQL diese in entsprechende Werte für unterschiedliche Zeittypen: 0000-00-00 oder 0000-00-00 00:00:00 .

Wenn die Monate beispielsweise Januar bis Dezember sind und Sie versuchen, 2019-13-01 00:00:00 einzufügen, wird dies zu 0000-00-00 00:00:00 korrigiert, da es keinen 13. Monat gibt und dies ein ungültiger Wert ist.

4. Strenger Modus

Wenn wir einen ungültigen Zeitwert einfügen, wird dieser korrigiert, im strikten Modus werden die Daten jedoch nicht eingefügt und stattdessen ein Fehler gemeldet:

FEHLER 1292 (22007): Falscher Datums-/Uhrzeitwert: „1970-01-01 08:00:00“ für Spalte „Zeit“ in Zeile 1


Wir können das Verhalten von MySQL anpassen, indem wir den Modus festlegen. Überprüfen Sie zunächst den MySQL-Modus:

mysql> Variablen wie „%sql_mode%“ anzeigen;            
+----------------------------+--------------------------------------------+
| Variablenname | Wert |
+----------------------------+--------------------------------------------+ |
| SQL-Modus | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+----------------------------+--------------------------------------------+


In diesem Modus werden ungültige Daten als Fehler gemeldet. Wir können den Modus auf ALLOW_INVALID_DATES anpassen:

mysql> setze Sitzungs-SQL-Modus = 'ALLOW_INVALID_DATES';
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> Variablen wie „%sql_mode%“ anzeigen;            
+------------------+---------------------+
| Variablenname | Wert |
+------------------+---------------------+
| SQL-Modus | ALLOW_INVALID_DATES |
+------------------+---------------------+
1 Zeile im Satz (0,00 Sek.)

In diesem Modus wird das Datum nicht mehr vollständig auf Gültigkeit geprüft, lediglich der Monat wird auf einen Wert im Bereich 1-12 und der Tag auf einen Wert im Bereich 1-31 geprüft. Dies ist bei der Verarbeitung von Benutzereingaben geeignet, allerdings ist dieser Modus nur für DATE und DATETIME geeignet. Für TIMESTAMP ist noch ein gültiger Wert erforderlich, sonst wird er auf 0000-00-00 00:00:00 korrigiert.

Bei ungültigen Werten wird bei aktiviertem Modus ein Fehler gemeldet, bei deaktiviertem Modus wird auf 0000-00-00 00:00:00 korrigiert und eine Warnung generiert:

mysql> in alarm_service-Werte einfügen (7, '1970-01-01 08:00:00'); 
Abfrage OK, 1 Zeile betroffen, 1 Warnung (0,00 Sek.)

Zusammenfassen:

Für dieses Problem gibt es zwei Lösungen:

  1. Passen Sie die Zeit an den zulässigen Bereich an
  2. Passen Sie den strikten MySQL-Modus an, um unzulässige Zeiten zuzulassen

5. Fallzusammenfassung

ERROR 1067 (42000): Invalid default value for 'createTime'

Überprüfen Sie den Grund. Sie finden heraus, dass er wie folgt eingestellt ist:

# Sehen Sie sich die Anweisung zum Erstellen der Tabelle CREATE TABLE `dimensionsConf` an (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `createTime` Datum/Uhrzeit STANDARD CURRENT_TIMESTAMP,
) ENGINE=InnoDB AUTO_INCREMENT=178 DEFAULT CHARSET=utf8;

# Datenbankversion anzeigen $mysql --version
mysql Ver 14.14 Distrib 5.1.30, für unknown-linux-gnu (x86_64) mit EditLine-Wrapper

Dies ist das Ende dieses Artikels über MySQL-Zeittypen und -Modi. Weitere Informationen zu MySQL-Zeittypen und -Modi finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • MySQL-Zeittypauswahl
  • So wählen Sie den richtigen MySQL-Datums-/Uhrzeittyp zum Speichern Ihrer Zeit
  • Erläuterung des Problems bei der Auswahl des MySQL-Speicherzeittyps
  • Informationen zur Auswahl des MySQL-Zeittyps
  • Analysieren von MySql- und Java-Zeittypen
  • Zusammenfassung der Verwendung des MySQL-Datumsdatentyps und des Zeittyps

<<:  Beispiele für die Verwendung des Li-Tags in HTML

>>:  TypeScript-Dekorator-Definition

Artikel empfehlen

Detaillierte Erklärung der Zeit- und Datumsverarbeitung von moment.js

Konvertierung des Zeitformats von Montag auf Sonn...

Sicherheitseinstellungen für Windows 2016 Server

Inhaltsverzeichnis Systemupdate-Konfiguration Änd...

Lösen Sie das Problem verstümmelter Daten bei der MySQL-Datenbankmigration

Unter den Anweisungen meines Vorgesetzten übernah...

Implementierung des Nginx-Proxy-Ports 80 bis Port 443

Die Konfigurationsdatei nginx.conf lautet wie fol...

So stellen Sie Redis schnell als Docker-Container bereit

Inhaltsverzeichnis Erste Schritte Datenspeicherun...

Probleme und Lösungen bei der Installation von Docker in der Alibaba Cloud

Frage Bei der Installation von Docker mithilfe de...

Grundprinzipien des skalierbaren MySQL-Designs

Inhaltsverzeichnis Vorwort 1. Was ist Skalierbark...

Detaillierte Erklärung des Prinzips der Docker-Image-Schichtung

Basisbild Das Basisbild hat zwei Bedeutungen: Ist...

Wissen zur Suchmaschinenoptimierung, auf das Sie beim Webdesign achten sollten

1. Linklayout der neuen Site-Startseite 1. Die Pos...

Detailliertes Beispiel für das Datenbankbetriebsobjektmodell in Spring jdbc

Detailliertes Beispiel für das Datenbankbetriebso...

Analyse des Parameterübertragungsprozesses des Treibermoduls in Linux

Deklarieren Sie den Parameternamen, den Typ und d...

So fügen Sie in MySQL 8.0 schnell Spalten hinzu

Vorwort: Ich habe vor langer Zeit gehört, dass My...