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

Wie erhalte ich die aktuelle Zeitzone von MySQL?

Aus dem Handbuch (Abschnitt 9.6 ). ):

Die aktuellen Werte der globalen und mandantenspezifischen Zeitzonen können wie folgt abgerufen werden:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Bearbeiten Das Obige gibt SYSTEM zurück wenn MySQL so eingestellt ist, dass es die Zeitzone des Systems verwendet, was weniger hilfreich ist. Da Sie PHP verwenden, lautet die Antwort von MySQL SYSTEM , können Sie dann das System fragen, welche Zeitzone es ist über date_default_timezone_get verwenden . (Natürlich, wie VolkerK betonte, kann PHP auf einem anderen Server laufen, aber als Annahmen gehen wir davon aus, dass der Webserver und der DB-Server, mit dem es kommuniziert, auf eingestellt sind [wenn nicht sogar in ] dieselbe Zeitzone ist nicht groß Sprung.) Beachten Sie jedoch, dass Sie (wie bei MySQL) die von PHP verwendete Zeitzone festlegen können (date_default_timezone_set ), was bedeutet, dass möglicherweise ein anderer Wert als der vom Betriebssystem verwendete gemeldet wird. Wenn Sie die Kontrolle über den PHP-Code haben, sollten Sie wissen, ob Sie das tun, und damit einverstanden sein.

Aber die ganze Frage, welche Zeitzone der MySQL-Server verwendet, ist möglicherweise eine Randnotiz, denn wenn Sie den Server fragen, in welcher Zeitzone er sich befindet, sagt Ihnen das absolut nichts über die Daten in der Datenbank. Lesen Sie weiter für Details:

Weitere Diskussion :

Wenn Sie die Kontrolle über den Server haben, können Sie natürlich sicherstellen, dass die Zeitzone eine bekannte Größe ist. Wenn Sie keine Kontrolle über den Server haben, können Sie die von Ihrer Verbindung verwendete Zeitzone festlegen so:

set time_zone = '+00:00';

Dadurch wird die Zeitzone auf GMT gesetzt, sodass alle weiteren Operationen (wie now() ) verwendet GMT.

Beachten Sie jedoch, dass Zeit- und Datumswerte nicht sind mit Zeitzoneninformationen in MySQL gespeichert:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

Die Kenntnis der Zeitzone des Servers ist also nur in Bezug auf Funktionen wichtig, die die aktuelle Zeit erhalten, wie z. B. now() , unix_timestamp() , etc.; es sagt nichts darüber aus, welche Zeitzone die Daten in den Datenbankdaten verwenden. Vielleicht entscheiden Sie sich für die Annahme Sie wurden unter Verwendung der Zeitzone des Servers geschrieben, aber diese Annahme kann durchaus fehlerhaft sein. Um die Zeitzone von in den Daten gespeicherten Daten oder Uhrzeiten zu kennen, müssen Sie sicherstellen, dass sie mit Zeitzoneninformationen gespeichert werden, oder (wie ich) sicherstellen, dass sie immer in GMT angegeben sind.

Warum ist die Annahme, dass die Daten unter Verwendung der Zeitzone des Servers geschrieben wurden, fehlerhaft? Nun, zum einen könnten die Daten über eine Verbindung geschrieben worden sein, die eine andere Zeitzone eingestellt hat. Die Datenbank wurde möglicherweise von einem Server auf einen anderen verschoben, wobei sich die Server in unterschiedlichen Zeitzonen befanden (ich bin darauf gestoßen, als ich eine Datenbank geerbt hatte, die von Texas nach Kalifornien verschoben worden war). Aber auch wenn Die Daten werden auf den Server geschrieben, mit seiner aktuellen Zeitzone ist es immer noch mehrdeutig. Letztes Jahr wurde in den Vereinigten Staaten die Sommerzeit am 1. November um 2:00 Uhr morgens abgeschaltet. Angenommen, mein Server befindet sich in Kalifornien und verwendet die pazifische Zeitzone, und ich habe den Wert 2009-11-01 01:30:00 in der Datenbank. Wann war es? War das 1:30 Uhr am 1. November PDT oder 1:30 Uhr am 1. November PST (eine Stunde später)? Du hast absolut keine Möglichkeit es zu wissen. Moral:Speichern Sie Daten/Zeiten immer in GMT (was keine Sommerzeit macht) und konvertieren Sie sie bei Bedarf in die gewünschte Zeitzone.