2011-12-08 21 views
7

Ho uno strano problema riguardante il fuso orario mysql.Come impostare correttamente il fuso orario mysql

Nel mio file di configurazione sito ho questa linea che imposta il fuso orario:

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

La parte divertente è che se aggiungo un'altra riga dopo questa come questo:

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

Dopo l'esecuzione quel codice, l'ora viene visualizzata correttamente.

MA, in alcune altre query inserisco righe in tabelle che hanno una colonna denominata data che viene impostata come valore predefinito CURRENT_TIMESTAMP.

righe vengono inserite in questo modo:

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

(La tabella sessioni ha una colonna date che il default è CURRENT_TIMESTAMP)

Ma il valore inserito nel DB punta ancora indietro al fuso orario del server: ((

Delle idee come lavorare con questo?

+0

Quando si dice che i valori inseriti nel DB tornano al fuso orario del server, come si controlla? Anche se una connessione in cui hai fatto il trucco 'SET SESSION time_zone'? – Romain

+0

stai chiudendo la connessione prima di eseguire 'INSERT'? – ManseUK

+0

Lo sto verificando su phpMyAdmin, e la connessione nope non è chiusa fino alla fine dell'esecuzione dello script –

risposta

19

dovete capire che MySQL mantiene ti multipla Mi impostazioni del fuso: il fuso orario

  • sistema (in pratica il fuso orario impostato in OS) fuso orario
  • Server (il fuso orario utilizzato da MySQL)
  • client fuso orario (il fuso orario della sessione utilizzato per la connessione

Vedere http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html per dettagli. I valori/ora

data sono memorizzati in due modi diversi: valori basati

  • Tutti unix timestamp sono sempre memorizzati in UTC. Sono convertiti internamente da e verso il fuso orario del client al volo quando vengono memorizzati e letti. Lo stesso vale per le funzioni NOW() e CURTIME() in quanto basate sul timestamp.
  • Le colonne DATE, TIME e DATETIME (che memorizzano i loro valori in un formato anno-mese-giorno ora-minuti-secondo) NON sono interessate dalle impostazioni del fuso orario e non vengono mai convertite.

Da quanto sopra dovrebbe essere chiaro che i valori che si vedono quando si leggono da colonne basate su timestamp unix non sono necessariamente ciò che è realmente memorizzato nel DB. Vengono convertiti utilizzando il fuso orario del server e il fuso orario del client. Il risultato può essere fonte di confusione se non si capiscono i dettagli della meccanica.

Per un primo test cercare di scoprire le impostazioni correnti in ciascuno dei vostri programmi client eseguendo

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

Il fuso orario globale sarà sempre lo stesso. Tuttavia, il fuso orario della sessione può differire dall'applicazione client all'applicazione client e cambierà i risultati delle operazioni di lettura e scrittura.

+2

Grazie, davvero illuminante! Mi sono reso conto che phpMyAdmin stava visualizzando gli orari convertiti in timezone del server, ma se li leggo da DB nel mio script dopo aver impostato il fuso orario della sessione essi appaiono corretti quindi era solo phpMyAdmin che mi confondeva :) –

+0

@DanyKhalife Grazie per aver commentato questo , pensavo stavo impazzendo. – Mark

+0

@Jpsy Greate answer..i ho query come si imposta il fuso orario del client nel file mysql confiq ??? – goodyzain

Problemi correlati