Часовой пояс 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 приходится задавать часовой пояс в настройках РНР и системное время на сервере.