Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Time Zone in MySQL

Come MySQL gestisce il tempo: impostazioni per la configurazione della Time Zone, la gestione delle funzioni di MySQL e le regole in caso di cambiamento
Come MySQL gestisce il tempo: impostazioni per la configurazione della Time Zone, la gestione delle funzioni di MySQL e le regole in caso di cambiamento
Link copiato negli appunti

Con il termine Time Zone si indica il tempo corrente di un determinata località sulla base del fuso orario di riferimento e di conseguenza della sua posizione geografica, la localizzazione di un'applicazione o di un dato permette quindi di utilizzare un sistema di datazione contestuale alla relativa Time Zone; MySQL mette a disposizione numerosi strumenti per la gestione dei valori relativi al tempo, è ovvio che per tutte quelle informazioni per cui è importante la registrazione della data corrente (e i calcoli effettuati rispetto a questa) è necessario un efficiente supporto per la localizzazione.

In questa breve trattazione vedremo quali funzionalità vengono fornite da MySQL per le operazioni di localizzazione e la gestione delle Time Zone.

Impostazioni per la configurazione delle Time Zone

MySQL utilizza per la localizzazione tre diversi parametri che verranno analizzati di seguito nel dettaglio:

La Time Zone del sistema (o ambiente) in cui funziona il Database server (System Time Zone), in pratica, quando viene avviato il Web server esso prova a stabilire autonomamente la Time Zone relativa alla postazione corrente (macchina Host) e utilizza questo processo per la valorizzazione della variabile di sistema system_time_zone; dal momento in cui questo valore verrà registrato esso non verrà modificato.

Sarà possibile impostare la Time Zone di riferimento per il DBMS al momento dell'avvio del servizio utilizzando l'opzione --timezone=nome_timezone disponibile per i comandi basati sullo startup script mysqld_safe; se per esempio venisse passato all'opzione --timezone l'argomento Europe/London questo valore verrebbe settato sulla base della Time Zone relativa al meridiano di Greenwich è cioè un'ora indietro rispetto all'ora corrente italiana.

È possibile inoltre impostare la variabile d'ambiente relativa alla Time Zone precedentemente all'avvio del processo principale del Database server, il daemon mysqld, in questo caso è però necessario tenere conto della piattaforma di riferimento perché le variabili disponibili per l'opzione --timezone sono dipendenti dal sistema ed è quindi fondamentale conoscere a priori quali siano i valori accettabili.

La Time Zone corrente del server, essa dipende dalla variabile globale di sistema time_zone che conserva il valore relativo al server in cui esiste; questa globale ha un valore iniziale pari a SYSTEM, ciò vuol dire che la Time Zone di riferimento del Database server è uguale alla Time Zone del sistema in cui esso è in esecuzione.

In ogni caso, è possibile definire il valore iniziale della variabile time_zone al momento dell'avvio del DBMS utilizzando l'opzione da Shell default-time-zone=timezone, dove per default-time-zone si intende la Time Zone predefinita di MySQL, questa opzione potrà anche essere scritta in un file nella forma default-time-zone='timezone'; in alternativa è disponibile l'istruzione da linea di comando:

mysql> SET GLOBAL time_zone = timezone;

in questo modo la variabile in oggetto potrà essere settata anche in fase di esecuzione del Database server (a runtime), il comando potrà essere utilizzato però soltanto da coloro a cui sono stati associati SUPER privilegi, cioè soltanto gli utenti che possono arrestare i processi di sistema.

La Time Zone di pre-connessione, questa modalità di configurazione potrà essere utilizzata per via del fatto che ogni client in connessione con il DBMS possiede una Time zone pre-impostata il cui valore è archiviato nella variabile di sessione time_zone; in fase di avvio questa variabile prende il suo valore dalla globale omonima, per ogni client è però possibile definire un nuovo valore utilizzando l'istruzione da linea di comando:

mysql> SET time_zone = timezone;

A differenza del comando visto in precedenza infatti, in quest'ultimo non è il valore della globale del server a venire modificato ma quello relativo alla variabile di sessione del client.

Time Zone e funzioni di MySQL

La Time Zone di un sessione influenza gli output prodotti da alcune funzioni per la gestione del tempo e delle date in MySQL; dato che i valori prodotti da essi dipendono dalla Time Zone della sessione aperta, questi sono definiti come Zone-Sensitive, in pratica il loro comportamento è condizionato dalla Time Zone corrente.

Questa influenza si estende anche ai dati memorizzati dal Database server, infatti la Time Zone non si limita e determinare gli esiti di funzioni come NOW(), per la restituzione della data e del tempo corrente, o CURTIME(), per la restituzione dell'orario corrente, ma condiziona anche il valore relativo ai TIMESTAMP registrati dal DBMS.

Come è noto il timestamp è un sistema di misurazione del tempo che consiste nel contare il numero dei secondi a partire da una data, la UNIX epoch, fissata il 1 gennaio 1970 UTC alle ore 00:00:00, dove UTC è il tempo coordinato universale cioè il fuso orario di riferimento da cui sono calcolati tutti gli altri fusi orari della Terra; MySQL registra il dato prodotto dal TIMESTAMP in un'apposita colonna, nel caso in cui esista una sessione aperta il DBMS convertirà i valori dalla Time Zone corrente ad UTC per l'archiviazione e da UTC alla Time Zone corrente per il loro recupero.

La Time Zone corrente non ha invece influenza sugli output prodotti dalla chiamata di funzioni come DATE() (estrae la parte relativa alla data da un timestamp), TIME() (estrae la parte relativa all'ora da un timestamp) e DATETIME() (riunisce le funzioni precedenti) né sulle relative colonne del database; esiste però una influenza indiretta dovuta al valore assunto dal timestamp che viene passato loro come argomento nel momento in cui esse devono effettuare le operazioni di conversione in date e orari.

Regole in caso di modifica delle Time Zone

Se si desidera visualizzare il valore corrente relativo alla variabile time_zone globale e il valore specifico di una Time Zone per un determinato client connesso al Database server, il comando da utilizzare dovrà essere il seguente:

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

Il valore restituito dall'istruzione potrà assumere differenti formati:

  • sarà possibile ricevere in output una stringa che sarà il risultato della distanza tra il Time Zone corrente e il tempo coordinato universale, ad esempio +11:30 o -5:15;
  • sarà possibile visualizzare il valore SYSTEM indicante il fatto che la Time Zone corrente è la stessa rispetto alla Time Zone relativa al sistema;
  • si potrà ricevere come risultato il nome di una determinata Time Zone, per esempio Europe/Rome.

Se si desidera ricevere in output il nome di una Time Zone, le relative informazioni dovranno essere memorizzate nelle apposite tabelle messe a disposizione dal DBMS per questo scopo. Sarà possibile scaricare un elenco completo dei nomi delle Time Zone su questa pagina della Documentazione ufficiale di MySQL.

I nomi e le regole per le Time Zone non sono mai definitivi, spesso subiscono degli aggiornamenti; nel caso in cui venissero effettuate delle modifiche a carico delle regole di una o più Time Zone, le applicazioni basate sull'utilizzo delle vecchie regole diventerebbero obsolete; per evitare problemi a carico delle sessioni di lavoro tramite il DBMS è possibile sfruttare alcuni accorgimenti:

  • informarsi frequentemente riguardo agli aggiornamenti disponibili per il proprio sistema operativo, un update permetterà di utilizzare le informazioni più recenti sulle Time Zone; un accorgimento da utilizzare in particolare quando la Time Zone del Database server dipende da quella di sistema (per via del valore SYSTEM);
  • nel caso in cui venga sostituito il file di sistema etc/localtime per le Time Zone con una nuova versione, perché le nuove regole abbiano efficacia sarà necessario riavviare il processo mysqld, diversamente il DBMS non potrà rilevare le modifiche e continuerà ad utilizzare le regole precedentemente osservate;
  • se si utilizzano i nomi delle Time Zone nelle proprie operazioni di localizzazione con MySQL è bene che le relative tabelle siano sempre aggiornate, anche in questo caso dopo un update sarà necessario procedere con un riavvio in modo che il DBMS non continui a utilizzare le informazioni ancora residenti in cache.

Nel caso in cui non si conoscano i nomi disponibili per le Time Zone in una determinata installazione di MySQL, è possibile scoprire se la relativa tabella è vuota o meno utilizzando una semplice istruzione da linea di comando:

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;

Quando il valore restituito da questa interrogazione è pari a zero, i nomi di Time Zone non saranno disponibili per alcun utente, un valore superiore indica invece la disponibilità di uno o più nomi di Time Zone.

Conclusioni

La localizzazione e la configurazione delle Time Zone in MySQL sono due importanti procedure in quanto consentono di utilizzare in modo corretto le funzioni, gli attributi e le tabelle destinate da MySQL alla gestione di tempo, date e orari.

In questa breve trattazione sono state descritte tutte le variabili che presiedono alla gestione delle Time Zone, le possibili impostazioni per il server e per i client, le più importanti istruzioni per la manipolazione dei dati relativi alla localizzazione e gli accorgimenti per utilizzare in modo efficace questo strumento.

Ti consigliamo anche