Timezones v MySQL

1 minute read

Nekoč davno sem se potreboval na isti MySQL strežnik povezovati iz različnih časovnih pasov. Verjetno je bilo to še v verziji 3 in nekaj, po besnem prebiranju dokumentacije sem obupal, ne da se.

Pa sem pred kratkim spet prišel do tega problema, se zdaj da? Seveda, že nekaj časa, če prav razumem, od verzije 4.1.3 naprej. Nerodno je sicer, da se vse skupaj pozna le na funkcijah NOW() in CURTIME() ter vrednostih, ki so shranjene v poljih tipa TIMESTAMP, pa vseeno. Če v eno tabelo vedno pišem le iz enega časovnega pasu, ne bo večjih problemov.

Rešitev je povsem enostavna, izvedemo le naslednje:

SET time_zone = timezone;

Namesto timezone seveda vpišemo izbrani časovni pas, lahko v formatu +1:00, -10:00 ali pa v opisnem, recimo CET, Europe/Ljubljana in podobno. Za uporabo slednjih je potrebno še populirati tabele, ki so v podatkovni bazi z imenom mysql sicer že pripravljene, ampak žal prazne. To storimo iz shella, takole:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Gornja zadeva prebere sistemske nastavitve iz direktorija /usr/share/zoneinfo in jih shrani v ustrezne MySQLove sistemske tabele.

Napisano ni noben trik ali hack in več o tem lahko preberete tudi v navodilih, zdelo se mi je le vredno opozoriti na ta MySQLov feature, za katerega doslej pač nisem vedel iz preprostega razloga, nisem ga potreboval. Mogoče ga pa kdo od vas potrebuje, pa ne ve zanj in je pač le prelen, da bi bral dokumentacijo :)

Updated: