Вы затрагиваете сложную тему.
Когда столбец таблицы имеет тип данных TIMESTAMP
, все значения сохраняются в UTC после перевода с вашего текущего time_zone
установка на UTC.Когда вы извлекаете значения из этих столбцов, они переводятся обратно в ваш текущий time_zone
.Это удобно, потому что вы можете представлять метки даты пользователям во всем мире по их собственному местному времени, обрабатывая time_zone
как предпочтение пользователя.
Когда столбец имеет тип данных DATETIME
, переводы doне происходит .
Вот пример:
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
SET time_zone = 'UTC';
INSERT INTO t1 (ts, dt) VALUES (NOW(), NOW());
SET time_zone = 'Europe/Paris';
INSERT INTO t1 (ts, dt) VALUES (NOW(), NOW());
SET time_zone = 'UTC';
SELECT * FROM t1; /* notice differences presentation of ts columns, ds stay the same */
SET time_zone = 'Europe/Paris';
SELECT * FROM t1; /* again */
SET time_zone = 'America/Halifax';
SELECT * FROM t1; /* again */
Совет для профессионалов: Если вы используете именованные часовые пояса Europe/Paris
, вы автоматически получите преимущество от правил перехода на летнее время длялокаль, которую вы выбрали.Правила, известные как база данных zoneinfo , поддерживаются IANA .Многие дистрибутивы Linux включают регулярные обновления в базу данных zoneinfo.