Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Strefy czasowe MySQL

Domyślnie (przynajmniej w instalacjach opartych na Debianie) do MySQL nie są ładowane żadne dane strefy czasowej. Jeśli chcesz sprawdzić, czy są załadowane, spróbuj wykonać:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Jeśli zwraca DATETIME (w tym przypadku 2012-06-07 08:00:00 ), masz załadowane strefy czasowe. Jeśli zwraca NULL , nie są. Gdy nie jest załadowany, możesz konwertować za pomocą przesunięć (np. +10:00 lub -6:00 ).

Powinno to działać dobrze w wielu przypadkach, ale są chwile, kiedy lepiej jest używać nazwanych stref czasowych, na przykład nie martwić się o czas letni. Wykonanie następującego polecenia ładuje dane strefy czasowej z systemu (tylko Unix. Nie jestem pewien, jakie byłoby równoważne polecenie Windows):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Jeśli musisz stale polegać na strefach czasowych MySQL, powyższe polecenie powinno być wykonywane za każdym razem, gdy systemowa strefa czasowa jest aktualizowana . Możesz też po prostu dodać go do tygodniowego lub miesięcznego zadania crona, aby zrobić to automatycznie.

Następnie, aby wyświetlić listę stref czasowych, wykonaj następujące czynności:

USE mysql;
SELECT * FROM `time_zone_name`;

Uwaga, informacje o strefie czasowej zajmują w MySQL około 5 MB. Jeśli kiedykolwiek będziesz chciał wyładować informacje o strefie czasowej, po prostu wykonaj następujące czynności i uruchom ponownie MySQL:

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

Nie DROP te stoły lub zdarzy się coś złego.

Edytuj:

Na podstawie poniższego komentarza użytkownika, jeśli chcesz, aby strefy czasowe były automatycznie aktualizowane podczas aktualizacji systemu, musisz najpierw zezwolić rootowi na zalogowanie się bez pytania o hasło.

MySQL>=5.6.6

Wykonaj następujące [źródło ]:

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

MySQL <5.6.6

Utwórz ~/.my.cnf plik (jeśli jeszcze nie istnieje) i dodaj:

[client]
user=root
password=yourMysqlRootPW

Następnie uruchom chmod 600 ~/.my.cnf aby upewnić się, że nikt inny nie może go przeczytać.

Aktualizuj skrypt

Dodaj następujący skrypt do crontab, aby był wykonywany raz dziennie:

#!/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

Usuń echo wiersze, jeśli nie chcesz żadnego wyjścia.

Uwaga:jest to (w większości) nietestowane. Daj mi znać, jeśli masz jakiekolwiek problemy, a zaktualizuję tę odpowiedź.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL i PHP:UTF-8 ze znakami cyrylicy

  2. Jak uciec od pojedynczych cudzysłowów w MySQL

  3. Uruchom MySQLDump bez blokowania tabel

  4. Jak wyeksportować dane z SQL Server 2005 do MySQL

  5. Generowanie serii dat