Mysql
 sql >> Base de données >  >> RDS >> Mysql

Fuseaux horaires MySQL

Par défaut, (du moins sur les installations basées sur Debian), aucune donnée de fuseau horaire n'est chargée dans MySQL. Si vous voulez tester s'ils sont chargés, essayez d'exécuter :

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

S'il renvoie un DATETIME (dans ce cas 2012-06-07 08:00:00 ), vous avez chargé des fuseaux horaires. S'il renvoie NULL , ils ne le sont pas. Lorsqu'il n'est pas chargé, vous êtes limité à la conversion à l'aide de décalages (par exemple, +10:00 ou -6:00 ).

Cela devrait fonctionner correctement dans de nombreux cas, mais il est parfois préférable d'utiliser des fuseaux horaires nommés, par exemple pour ne pas se soucier de l'heure d'été. L'exécution de la commande suivante charge les données de fuseau horaire du système (Unix uniquement. Je ne sais pas quelle serait la commande Windows équivalente) :

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

Si vous devez continuellement compter sur les fuseaux horaires MySQL, la commande ci-dessus doit être exécutée à chaque fois que le fuseau horaire du système est mis à jour . Vous pouvez également simplement l'ajouter à une tâche cron hebdomadaire ou mensuelle pour le faire automatiquement pour vous.

Ensuite, pour afficher une liste de fuseaux horaires, procédez comme suit :

USE mysql;
SELECT * FROM `time_zone_name`;

Notez que les informations de fuseau horaire occupent environ 5 Mo dans MySQL. Si jamais vous souhaitez décharger les informations de fuseau horaire, exécutez simplement ce qui suit et redémarrez MySQL :

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

Ne pas DROP ces tableaux ou de mauvaises choses arriveront.

Modifier :

Sur la base d'un commentaire d'utilisateur ci-dessous, si vous souhaitez que les fuseaux horaires soient automatiquement mis à jour lorsque vous mettez à jour le système, vous devez d'abord autoriser root à se connecter sans être invité à entrer un mot de passe.

MySQL>=5.6.6

Exécutez la [source suivante ] :

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

MySQL < 5.6.6

Créer un ~/.my.cnf fichier (s'il n'existe pas encore) et ajoutez ce qui suit :

[client]
user=root
password=yourMysqlRootPW

Puis exécutez chmod 600 ~/.my.cnf pour vous assurer que personne d'autre ne peut le lire.

Script de mise à jour

Ajoutez le script suivant à crontab pour qu'il soit exécuté une fois par jour :

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

Supprimer l'echo lignes si vous ne voulez aucune sortie.

Remarque :ceci n'a (pour la plupart) pas été testé. Faites-moi savoir si vous avez des problèmes et je mettrai à jour cette réponse.