Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Zeitzonen

Standardmäßig (zumindest bei Debian-basierten Installationen) werden keine Zeitzonendaten in MySQL geladen. Wenn Sie testen möchten, ob sie geladen sind, versuchen Sie es mit:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Wenn es ein DATETIME zurückgibt (in diesem Fall 2012-06-07 08:00:00 ), haben Sie Zeitzonen geladen. Wenn es NULL zurückgibt , das sind sie nicht. Wenn nicht geladen, sind Sie auf die Konvertierung mit Offsets beschränkt (z. B. +10:00 oder -6:00 ).

Dies sollte in vielen Fällen gut funktionieren, aber es gibt Zeiten, in denen es besser ist, benannte Zeitzonen zu verwenden, z. B. um sich keine Gedanken über die Sommerzeit zu machen. Das Ausführen des folgenden Befehls lädt die Zeitzonendaten aus dem System (nur Unix. Ich bin mir nicht sicher, was der entsprechende Windows-Befehl wäre):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Wenn Sie sich ständig auf MySQL-Zeitzonen verlassen müssen, sollte der obige Befehl jedes Mal ausgeführt werden, wenn die Systemzeitzone aktualisiert wird . Sie können es auch einfach zu einem wöchentlichen oder monatlichen Cron-Job hinzufügen, um es automatisch für Sie zu erledigen.

Gehen Sie dann wie folgt vor, um eine Liste der Zeitzonen anzuzeigen:

USE mysql;
SELECT * FROM `time_zone_name`;

Beachten Sie, dass die Zeitzoneninformationen in MySQL etwa 5 MB beanspruchen. Wenn Sie jemals die Zeitzoneninformationen entladen möchten, führen Sie einfach Folgendes aus und starten Sie MySQL neu:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

Nicht DROP diese Tabellen oder schlimme Dinge passieren.

Bearbeiten:

Basierend auf einem Benutzerkommentar unten, wenn Sie möchten, dass die Zeitzonen automatisch aktualisiert werden, wenn Sie das System aktualisieren, müssen Sie zuerst root erlauben, sich anzumelden, ohne zur Eingabe eines Passworts aufgefordert zu werden.

MySQL>=5.6.6

Führen Sie die folgende [Quelle aus ]:

mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6

Erstellen Sie eine ~/.my.cnf Datei (falls noch nicht vorhanden) und fügen Sie Folgendes hinzu:

[client]
user=root
password=yourMysqlRootPW

Führen Sie dann chmod 600 ~/.my.cnf aus um sicherzustellen, dass niemand sonst es lesen kann.

Skript aktualisieren

Fügen Sie crontab das folgende Skript hinzu, das einmal täglich ausgeführt wird:

#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24   
# hours and do not have ".tab" in the name (since these are not timezone files) 
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo "Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo "Done!\n"
fi

Entfernen Sie das echo Zeilen, wenn Sie keine Ausgabe wünschen.

Hinweis:Dies ist (meistens) ungetestet. Lassen Sie mich wissen, wenn Sie irgendwelche Probleme haben, und ich werde diese Antwort aktualisieren.