Nie, nie można zmienić strefy czasowej dla pojedynczej bazy danych w instancji MySQL.
Możemy pobrać serwer i klienta time_zone
ustawienia z zapytaniem, na przykład:
SELECT @@global.time_zone, @@session.time_zone;
Możemy również zmienić strefę czasową klienta dla sesji lub zmienić strefę czasową dla całej instancji MySQL.
Ale musimy być bardzo świadomi implikacji, jakie ta zmiana będzie miała dla istniejących połączeń klientów, oraz tego, w jaki sposób DATETIME
i TIMESTAMP
wartości już zapisane w instancji zostaną zinterpretowane.
Aby ustawić strefę czasową serwera podczas uruchamiania instancji MySQL, możemy zmodyfikować /etc/my.cnf
(lub gdziekolwiek są odczytywane parametry inicjalizacji instancji mysql), pod [mysqld]
sekcja:
[mysqld]
default-time-zone='+00:00'
-- lub --
Możliwe jest również (mniej pożądane) dodanie --default_time_zone='+00:00'
opcja mysqld_safe
UWAGA: Zmiana ustawienia strefy czasowej na serwerze MySQL NIE zmienia wartości przechowywanych w istniejących kolumnach DATETIME lub TIMESTAMP, ALE ponieważ skutecznie zmienia kontekst, w którym te przechowywane wartości są interpretowane, wygląda na to, że wszystkie wartości są przesunięte. (Gdzie 08:00 przyjęto oznaczać 8 rano CST, przy zmianie strefy czasowej serwera z CST na GMT, ten sam „08:00” zostanie teraz uznany za 8 rano GMT, co w rzeczywistości będzie oznaczać 2 w nocy CST.
Pamiętaj też, że kolumny TIMESTAMP są zawsze przechowywane w czasie UTC, podczas gdy kolumny DATETIME nie mają strefy czasowej.http://dev.mysql.com/doc/refman/5.5/en/datetime.html
Każda sesja klienta może zmienić ustawienie strefy czasowej dla własnej sesji:
SET time_zone='-06:00';
Ale nic z tego tak naprawdę nie „rozwiązuje” problemu konwersji strefy czasowej, po prostu przesuwa problem konwersji.
W warstwie aplikacji obsługującej konwersje stref czasowych nie ma nic z natury „złego”; czasami jest to najlepsze miejsce do załatwienia. Po prostu trzeba to zrobić poprawnie i konsekwentnie.
(Dziwne w opisanej konfiguracji jest to, że aplikacja przechowuje wartości DATETIME tak, jakby strefa czasowa serwera MySQL była ustawiona na GMT, ale strefa czasowa serwera MySQL jest ustawiona na coś innego.)