2011-12-08 18 views
7

Mam dziwny problem dotyczący strefy czasowej mysql.Jak poprawnie ustawić strefę czasową mysql

W mojej stronie pliku konfiguracyjnym mam tę linię, która wyznacza strefę czasową:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that 

Najśmieszniejsze jest to, że jeśli dodać kolejną linię tuż po tym jak ten:

$q = mysql_query("SELECT NOW() as now"); 
$row = mysql_fetch_array($row); 
echo $row["now"]; 

Po wykonaniu ten kod, czas jest wyświetlany poprawnie.

BUT, w niektórych innych zapytaniach wstawiam wiersze do tabel, które mają kolumnę o nazwie date, która domyślnie przyjmuje wartość CURRENT_TIMESTAMP.

Wiersze są wstawiane tak:

INSERT INTO `sessions` (`user_id`) VALUES `1` 

(tabela Sesje ma date kolumny, który domyślnie CURRENT_TIMESTAMP)

Jednak wartość włożony w DB nadal wskazuje z powrotem do strefy czasowej serwera: ((

Wszelkie pomysły jak pracować przez to?

+0

Kiedy mówisz, że wartości wstawione w DB wskazują na strefę czasową serwera, w jaki sposób sprawdzasz? Również przez połączenie, w którym wykonałeś sztuczkę 'SET SESSION time_zone'? – Romain

+0

czy zamykasz połączenie przed uruchomieniem 'INSERT'? – ManseUK

+0

Sprawdzam to na phpMyAdminie, a połączenie nope nie jest zamknięte do końca wykonywania skryptu –

Odpowiedz

19

Musisz zrozumieć, że MySQL utrzymuje wielokrotnego ti mi ustawienia strefy: strefę czasową

  • System (w zasadzie strefa czasowa ustawiona w OS) strefa
  • Serwer czasu (strefa czasowa używana przez MySQL)
  • strefa czasowa klienta (strefa czasowa sesja wykorzystywane na połączenie)

Aby uzyskać szczegółowe informacje, patrz: http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html. Wartości/czas

data są przechowywane w dwóch różnych sposobów: wartości oparte

  • Wszystko uniksowy znacznik czasu są zawsze przechowywane w UTC. Są one wewnętrznie konwertowane do strefy czasowej klienta w locie, gdy są przechowywane i czytane. To samo dotyczy funkcji NOW() i CURTIME(), ponieważ są oparte na znaczniku czasu.
  • Kolumny DATA, CZAS i DATETIME (przechowujące ich wartości w formacie rok-miesiąc-dzień, godzina-minuty-sekundy) NIE podlegają ustawieniom strefy czasowej i nigdy nie są przekształcane.

Z powyższego powinno stać się jasne, że wartości widoczne podczas czytania z kolumn opartych na uniksowym sygnaturach czasowych niekoniecznie muszą być przechowywane w bazie danych. Są konwertowane za pomocą strefy czasowej serwera i strefy czasowej klienta. Wynik może być mylący, jeśli nie rozumiesz szczegółów mechaniki.

Do pierwszego testu spróbować dowiedzieć się bieżące ustawienia w każdym z programów klienckich wykonując

SELECT @@global.time_zone, @@session.time_zone; 

Światowy strefa czasowa zawsze będzie taka sama. Strefa czasowa sesji może jednak różnić się od aplikacji klienckiej do aplikacji klienckiej i zmieni wyniki operacji odczytu i zapisu.

+2

Dzięki, bardzo pouczające! Zauważyłem, że phpMyAdmin wyświetlał czasy konwertowane na strefę czasową serwera, ale jeśli przeczytałem je z DB w moim skrypcie po ustawieniu strefy czasowej sesji, to wyglądają one poprawnie, więc to tylko phpMyAdmin mnie pomylił :) –

+0

@DanyKhalife Dzięki za komentowanie tego , myślałem, że szaleję. – Mark

+0

@Jpsy Odpowiedź Greate ... ma pytanie, jak ustawić strefę czasową klienta w pliku mysql confiq ??? – goodyzain

Powiązane problemy