Mysql
 sql >> база данни >  >> RDS >> Mysql

Часови зони на MySQL

По подразбиране (поне при инсталации, базирани на 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 MB в MySQL. Ако някога искате да разтоварите информацията за часовата зона, просто изпълнете следното и рестартирайте MySQL:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

Не DROP тези масии или ще се случат лоши неща.

Редактиране:

Въз основа на потребителски коментар по-долу, ако искате часовите зони да се актуализират автоматично, когато актуализирате системата, първо трябва да разрешите на root да влезе, без да бъдете подканени за парола.

MySQL>=5.6.6

Изпълнете следния [източник ]:

mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6

Създайте ~/.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 редове, ако не искате никакъв изход.

Забележка:Това е (предимно) непроверено. Уведомете ме, ако имате проблеми и ще актуализирам този отговор.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да стартирате mysqladmin flush-hosts на Amazon RDS

  2. Възстановяване на MySQL 8.0 Slave за репликация с помощта на Clone Plugin

  3. Може ли да се използва число за именуване на колона на MySQL таблица?

  4. Сортиране в MySQL с помощта на подреждане по клауза

  5. MySQL IFNULL() Обяснено