Som standard (i det mindste på Debian-baserede installationer) indlæses ingen tidszonedata i MySQL. Hvis du vil teste, om de er indlæst, prøv at udføre:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Hvis den returnerer en DATETIME
(i dette tilfælde 2012-06-07 08:00:00
), har du indlæst tidszoner. Hvis den returnerer NULL
, det er de ikke. Når den ikke er indlæst, er du begrænset til at konvertere ved hjælp af offsets (f.eks. +10:00
eller -6:00
).
Dette burde fungere fint i mange tilfælde, men der er tidspunkter, hvor det er bedre at bruge navngivne tidszoner, som for ikke at bekymre dig om sommertid. Ved at udføre følgende kommando indlæses tidszonedataene fra systemet (kun Unix. Jeg er ikke sikker på, hvad den tilsvarende Windows-kommando ville være):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Hvis du konstant skal stole på MySQL-tidszoner, skal ovenstående kommando udføres hver gang systemets tidszone opdateres . Du kan også bare tilføje det til et ugentligt eller månedligt cron-job for at gøre det automatisk for dig.
For derefter at se en liste over tidszoner skal du blot gøre følgende:
USE mysql;
SELECT * FROM `time_zone_name`;
Bemærk, tidszoneoplysningerne fylder omkring 5 MB i MySQL. Hvis du nogensinde vil fjerne tidszoneoplysningerne, skal du bare udføre følgende og genstarte MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Undgå DROP
disse tabeller eller der vil ske dårlige ting.
Rediger:
Baseret på en brugerkommentar nedenfor, hvis du vil have tidszonerne opdateret automatisk, når du opdaterer systemet, skal du først tillade root at logge ind uden at blive bedt om en adgangskode.
MySQL>=5.6.6
Udfør følgende [kilde ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Opret en ~/.my.cnf
fil (hvis den ikke findes endnu) og tilføj følgende:
[client]
user=root
password=yourMysqlRootPW
Udfør derefter chmod 600 ~/.my.cnf
for at sikre, at ingen andre kan læse den.
Opdater script
Tilføj følgende script til crontab for at blive udført én gang om dagen:
#!/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
Fjern echo
linjer, hvis du ikke ønsker noget output.
Bemærk:Dette er (for det meste) ikke testet. Fortæl mig, hvis du har problemer, så opdaterer jeg dette svar.