sql >> Databáze >  >> RDS >> Mysql

Časová pásma MySQL

Ve výchozím nastavení (alespoň u instalací založených na Debianu) se do MySQL nenačítají žádná data časového pásma. Pokud chcete otestovat, zda jsou načteny, zkuste provést:

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

Pokud vrátí DATETIME (v tomto případě 2012-06-07 08:00:00 ), máte načtená časová pásma. Pokud vrátí NULL , nejsou. Když není načten, jste omezeni na převod pomocí offsetů (např. +10:00 nebo -6:00 ).

To by mělo v mnoha případech fungovat dobře, ale jsou chvíle, kdy je lepší použít pojmenovaná časová pásma, například když se nemusíte starat o letní čas. Spuštěním následujícího příkazu se načtou data časového pásma ze systému (pouze pro Unix. Nejsem si jistý, jaký by byl ekvivalentní příkaz Windows):

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

Pokud se potřebujete neustále spoléhat na časová pásma MySQL, výše uvedený příkaz by měl být proveden při každé aktualizaci časového pásma systému . Můžete to také jednoduše přidat do týdenní nebo měsíční úlohy cron, aby to udělal za vás automaticky.

Poté, chcete-li zobrazit seznam časových pásem, proveďte následující:

USE mysql;
SELECT * FROM `time_zone_name`;

Všimněte si, že informace o časovém pásmu zabírají v MySQL asi 5 MB. Pokud někdy budete chtít zrušit načtení informací o časovém pásmu, stačí provést následující a restartovat MySQL:

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

Ne DROP tyto tabulky nebo se stanou špatné věci.

Upravit:

Na základě komentáře uživatele níže, pokud chcete, aby se časová pásma automaticky aktualizovala při aktualizaci systému, musíte nejprve povolit rootovi přihlášení bez výzvy k zadání hesla.

MySQL>=5.6.6

Spusťte následující [zdroj ]:

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

MySQL <5.6.6

Vytvořte ~/.my.cnf soubor (pokud ještě neexistuje) a přidejte následující:

[client]
user=root
password=yourMysqlRootPW

Poté spusťte chmod 600 ~/.my.cnf aby to nikdo jiný nemohl číst.

Aktualizovat skript

Přidejte do crontab následující skript, který se má spouštět jednou denně:

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

Odstraňte echo řádky, pokud nechcete žádný výstup.

Poznámka:Toto je (většinou) netestováno. Pokud máte nějaké problémy, dejte mi vědět a já tuto odpověď aktualizuji.



  1. Chyba MySQL #1071 - Zadaný klíč byl příliš dlouhý; maximální délka klíče je 767 bajtů

  2. Jak Access komunikuje se zdroji dat ODBC? Část 5

  3. Jak předat proměnnou null do uložené procedury SQL z kódu C#.net

  4. Změňte sloupce PostgreSQL používané v pohledech