По умолчанию (по крайней мере в установках на основе Debian) данные о часовых поясах не загружаются в MySQL. Если вы хотите проверить, загружены ли они, попробуйте выполнить:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Если он возвращает DATETIME
(в данном случае 2012-06-07 08:00:00
), у вас загружены часовые пояса. Если он возвращает NULL
, это не так. Когда вы не загружены, вы ограничены конвертированием с использованием смещений (например, +10:00
или -6:00
).
Во многих случаях это должно работать нормально, но бывают случаи, когда лучше использовать именованные часовые пояса, например, чтобы не беспокоиться о переходе на летнее время. Выполнение следующей команды загружает данные о часовом поясе из системы (только для Unix. Я не уверен, какой будет эквивалентная команда Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Если вам необходимо постоянно полагаться на часовые пояса MySQL, указанную выше команду следует выполнять каждый раз, когда системный часовой пояс обновляется . Вы также можете просто добавить его к еженедельной или ежемесячной работе cron, чтобы сделать это автоматически.
Затем, чтобы просмотреть список часовых поясов, просто сделайте следующее:
USE mysql;
SELECT * FROM `time_zone_name`;
Обратите внимание, что информация о часовом поясе занимает около 5 МБ в MySQL. Если вы хотите разгрузить информацию о часовом поясе, просто выполните следующее и перезапустите MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Не DROP
этих таблиц , иначе случится что-то плохое.
Edit:
На основании приведенного ниже комментария пользователя, если вы хотите, чтобы часовые пояса автоматически обновлялись при обновлении системы, сначала вам нужно разрешить root входить в систему без запроса пароля.
MySQL> = 5.6.6
Выполнить следующий [ источник ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6 </h2>
Создайте файл ~/.my.cnf
(если он еще не существует) и добавьте следующее:
[client]
user=root
password=yourMysqlRootPW
Затем выполните chmod 600 ~/.my.cnf
, чтобы никто другой не смог его прочитать.
Обновление скрипта
Добавьте в crontab следующий скрипт, который будет выполняться один раз в день:
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
Удалите строки echo
, если вы не хотите выводить данные.
Примечание: это (в основном) не проверено. Дайте мне знать, если у вас возникнут проблемы, и я обновлю этот ответ.