Не, не е възможно да промените часовата зона за една база данни в MySQL екземпляр.
Можем да извлечем сървъра и клиента time_zone
настройки със заявка, като тази:
SELECT @@global.time_zone, @@session.time_zone;
Можем също да променим часовата зона на клиента за сесия или да променим часовата зона за целия MySQL екземпляр.
Но трябва да сме ясно наясно с последствията, които тази промяна ще има върху съществуващите клиентски връзки, и как DATETIME
и TIMESTAMP
стойностите, които вече са съхранени в екземпляра, ще бъдат интерпретирани.
За да зададете time_zone на сървъра при стартиране на MySQL екземпляр, можем да променим /etc/my.cnf
файл (или където и да се четат параметрите за инициализация на mysql екземпляр), под [mysqld]
раздел:
[mysqld]
default-time-zone='+00:00'
-- или --
Възможно е също (по-малко желателно) да добавите --default_time_zone='+00:00'
опция за mysqld_safe
ЗАБЕЛЕЖКА: Промяната на настройката на часовата зона на MySQL сървъра НЕ променя стойностите, съхранени в съществуващите колони DATETIME или TIMESTAMP, НО тъй като ефективно променя контекста, в който тези съхранени стойности се интерпретират, ще изглежда, че всички стойности СА изместени. (Където 08:00 се приема за 8:00 часа CST, като time_zone на сървъра е променено от CST на GMT, същото това „08:00“ вече ще се приема за 8:00 GMT, което на практика би било 2:00 CST.
Също така имайте предвид, че колоните TIMESTAMP винаги се съхраняват в UTC, докато колоните DATETIME нямат часова зона.http://dev.mysql.com/doc/refman/5.5/en/datetime.html
Всяка клиентска сесия може да промени настройката на часовата зона за собствената си сесия:
SET time_zone='-06:00';
Но нищо от това наистина не „решава“ проблема с преобразуването на часовата зона, а просто премества проблема с преобразуването.
Няма нищо по своята същност „лошо“ с приложния слой, обработващ преобразувания на часовата зона; понякога това е най-доброто място за работа. Просто трябва да се прави правилно и последователно.
(Странното в настройката, която описвате, е, че приложението съхранява стойности за DATETIME, сякаш часовата_зона на MySQL сървъра е зададена на GMT, но time_zone на MySQL сървъра е настроена на нещо друго.)