Часовой пояс MySQL, время сервера баз данных


Многие интернет-ресурсы написаны таким образом, что для корректной их работы требуется установка верной даты и времени (часового пояса)  MySQL — а также указания часового пояса в настройках РНР. Часовой пояс является одной из настроек сервера баз данных и может задаваться локально, глобально или для текущей пользовательской сессии.



Чтобы определить время MySQL нужно редактировать конфигурационный файл (для большинства дистрибутивов он располагается по адресу /etc/mysql/my.cnf) или задавать переменные непосредственно в консоли сервера баз данных. Рассмотрим задание временной зоны при помощи переменных.



Авторизуемся в консоли MySQL (потребуется пароль пользователя root)

mysql -u root -p



При помощи запроса SELECT NOW(); можно просмотреть текущие дату и время MySQL

mysql> SELECT NOW();
+———————+
| NOW() |
+———————+
| 2017-08-31 21:21:56 |
+———————+
1 row in set (0.00 sec)



Можно вывести только время без даты. Для этого нужно выполнить запрос SELECT CURTIME();

mysql> SELECT CURTIME();
+————+
| CURTIME() |
+————+
| 21:24:16 |
+————+
1 row in set (0.00 sec)



Как установить часовой пояс в MySQL


Установить часовой пояс для определенного пользователя можно выполнив в консоли MySQL

SET time_zone = '+05:00';



Чтобы изменения сохранились после перезагрузки и имели силу для всего сервера баз данных нужно задать глобальную переменную:

SET GLOBAL time_zone = '+5:00';



Можно также указывать имя временной зоны — например, MSK для Москвы, но лучшей практикой является задавать часовой пояс определяя разницу с временем по Гринвичу как сделано выше



Также время опционально для конкретной сессии

mysql> set @@session.time_zone = '+00:00';



Можно выяснить требуется ли задавать время для сессии выполнив:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+———————+———————+
| @@global.time_zone | @@session.time_zone |
+———————+———————+
| SYSTEM             | SYSTEM              |
+———————+———————+
1 row in set (0.00 sec)



В данном случае время сессии совпадает с системным и непосредственное его задание не требуется.



Время в MySQL может указываться в TIMESTAMP и DATETIME


  • DATETIME (значение занимает 8 байт) — время не зависит от временной зоны и выводится в том виде, в котором было задано. Изменив время в MySQL изменить значение в DATETIME нельзя (может меняться при установке времени для сессии). Выводится в виде YYYY-MM-DD-HH-MM-SS
  • TIMESTAMP  (значение занимает 4 байта) является абсолютным значением времени с начала эпохи Unix — с полуночи 1 января 1970 года, при выводе из базы учитывается часовой пояс (указанный для системы,  MySQL в целом или сессии MySQL), именно значение в TIMESTAMP обычно приходится корректировать. Значение TIMESTAMP выводится запросом SELECT NOW(); — TIMESTAMP же корректируется всеми приведенными в данном материале командами.


Общее правило для корректной работы приложения — время РНР должно совпадать с временем MySQL. Если корректируется время в РНР, то скорректировать его нужно и в MySQL.



Чаще всего на практике для сервера на котором работают один или несколько сайтов полезной оказывается команда:

SET GLOBAL time_zone = '+5:00';



Кроме часового пояса MySQL приходится задавать часовой пояс в настройках РНР и системное время на сервере.

Сказать спасибо