Bonjour. Mysql 5.7.25:
insert into mytable values('2019-03-31 02:06:29')
erreur de retour "# 1292 Valeur datetime incorrecte"
mais:
insert into mytable values('2019-03-31 03:06:29')
ne renvoie aucune erreur. (le type du champ est horodaté)
Où ai-je tort?
Merci
Chico
Si cela vous donne une erreur:
insert into mytable values('2019-03-31 02:06:29')
Mais cela ne veut pas:
insert into mytable values('2019-03-31 03:06:29')
Vous utilisez très probablement un fuseau horaire de type européen , en particulier CET (je suggère fortement de ne pas utiliser tz sur les bases de données, et utilisez simplement UTC, il est juste plus facile). L'UE (et d'autres pays) a changé les horloges de 2 -> 3 heures du matin ce dimanche pour l'ajustement de l'heure d'été , il n'est donc pas possible, si vous utilisez un tel TZ , pour insérer une donnée '2019-03-31 02: XX: XX', car ces données ne sont pas valides pour ce fuseau horaire.
Faire:
SELECT @@time_zone;
Pour savoir quel fuseau horaire vous utilisez. S'il indique SYSTEM, vérifiez-le sur le système d'exploitation.
Correction : Ne l'insérez pas, cette heure d'horloge n'existait pas, soit avant 2 ou après 3. Ou corrigez votre fuseau horaire de votre base de données ou os pour correspondre à celui que vous essayez d'insérer.
Correctif correct : Ne gérez pas les fuseaux horaires sur la base de données ( n'essayez jamais d'implémenter ensuite par vous-même ), faites-le uniquement au moment de la présentation et utilisez UTC pour le backend de votre application. Configurez également vos serveurs pour utiliser UTC.
J'ai rencontré un problème similaire lors de l'importation d'un vidage Mysql à partir d'une base de données avec un fuseau horaire différent. Cette colonne était un TIMESTAMP qui utilise le CURRENT_TIMESTAMP comme valeur par défaut.
En faisant un SELECT @@time_zone
J'ai vu que les deux serveurs utilisaient SYSTEM comme fuseau horaire. Mais en tapant date
sur le terminal, j'ai vu qu'un serveur utilisait UTC et l'autre AEST.
J'ai réalisé que nous pouvons définir le même fuseau horaire uniquement pour cette session d'importation en faisant
SET time_zone='+00:00'
et exécutez votre importation.
Ou vous pouvez définir votre fuseau horaire global mysql et ne pas avoir à vous en préoccuper à l'avenir (jusqu'à ce que vous redémarriez mysql).
SET @@global.time_zone='+00:00'
Vous pouvez le faire de différentes manières, en définissant une instruction init, ou comme décrit dans la documentation, ou même si vous utilisez MAMP. Vérifiez cette réponse pour la bonne façon de procéder.