sql >> Database >  >> RDS >> Mysql

MySQL-tijdzones

Standaard worden (tenminste bij op Debian gebaseerde installaties) geen tijdzonegegevens in MySQL geladen. Als je wilt testen of ze geladen zijn, probeer dan het volgende uit te voeren:

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

Als het een DATETIME . retourneert (in dit geval 2012-06-07 08:00:00 ), heb je tijdzones geladen. Als het NULL retourneert , dat zijn ze niet. Indien niet geladen, bent u beperkt tot het converteren met offsets (bijv. +10:00 of -6:00 ).

Dit zou in veel gevallen goed moeten werken, maar er zijn momenten waarop het beter is om benoemde tijdzones te gebruiken, bijvoorbeeld om je geen zorgen te maken over zomertijd. Als u de volgende opdracht uitvoert, worden de tijdzonegegevens van het systeem geladen (alleen Unix. Ik weet niet zeker wat de equivalente Windows-opdracht zou zijn):

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

Als u voortdurend op MySQL-tijdzones moet vertrouwen, moet de bovenstaande opdracht elke keer dat de systeemtijdzone wordt bijgewerkt, worden uitgevoerd . Je kunt het ook gewoon toevoegen aan een wekelijkse of maandelijkse cronjob om het automatisch voor je te doen.

Om vervolgens een lijst met tijdzones te bekijken, doet u het volgende:

USE mysql;
SELECT * FROM `time_zone_name`;

Let op, de tijdzone-informatie neemt ongeveer 5 MB in MySQL in beslag. Als u ooit de tijdzone-informatie wilt verwijderen, voert u gewoon het volgende uit en start u MySQL opnieuw:

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

Niet DROP deze tabellen of er zullen slechte dingen gebeuren.

Bewerken:

Op basis van een gebruikerscommentaar hieronder, als je wilt dat de tijdzones automatisch worden bijgewerkt wanneer je het systeem bijwerkt, moet je eerst root toestaan ​​om in te loggen zonder dat er om een ​​wachtwoord wordt gevraagd.

MySQL>=5.6.6

Voer de volgende [bron uit ]:

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

MySQL <5.6.6

Maak een ~/.my.cnf bestand (als het nog niet bestaat) en voeg het volgende toe:

[client]
user=root
password=yourMysqlRootPW

Voer vervolgens chmod 600 ~/.my.cnf . uit om ervoor te zorgen dat niemand anders het kan lezen.

Script bijwerken

Voeg het volgende script toe aan crontab om eenmaal per dag uit te voeren:

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

Verwijder de echo regels als u geen uitvoer wilt.

Let op:Dit is (meestal) niet getest. Laat het me weten als je problemen hebt en ik zal dit antwoord bijwerken.



  1. door komma's gescheiden lijst als een enkele tekenreeks, T-SQL

  2. SQL Server converteert varbinary naar string

  3. Hoe maak je een PL/SQL-functie in Oracle Database?

  4. Voorvertoning van documenten in Microsoft Access-formulier