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

Erreur dans MySQL lors de la définition de la valeur par défaut pour DATE ou DATETIME

L'erreur est due au mode sql qui peut être en mode strict selon la dernière documentation MYSQL 5.7

Documentation MySQL 5.7 dit :

Le mode strict détermine si le serveur autorise '0000-00-00' comme date valide :si le mode strict n'est pas activé, '0000-00-00' est autorisé et les insertions ne produisent aucun avertissement. Si le mode strict est activé, '0000- 00-00' n'est pas autorisé et les insertions génèrent une erreur, sauf si IGNORE est également indiqué. Pour INSERT IGNORE et UPDATE IGNORE, '0000-00-00' est autorisé et les insertions produisent un avertissement.

Pour vérifier le mode MYSQL

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

Désactivation du mode STRICT_TRANS_TABLES

Cependant autoriser le format 0000-00-00 00:00:00 vous devez désactiver le mode STRICT_TRANS_TABLES dans le fichier de configuration mysql ou par commande

Par commande

SET sql_mode = '';

ou

SET GLOBAL sql_mode = '';

Utilisation du mot-clé GLOBAL nécessite des super privilèges et affecte les opérations que tous les clients se connectent à partir de ce moment

si ci-dessus ne fonctionne pas, allez dans /etc/mysql/my.cnf (selon ubuntu) et commentez STRICT_TRANS_TABLES

De plus, si vous souhaitez définir de manière permanente le mode sql au démarrage du serveur, incluez SET sql_mode='' dans my.cnf sous Linux ou MacOS. Pour Windows, cela doit être fait dans my.ini fichier.

Remarque

Cependant, le mode strict n'est pas activé par défaut dans MYSQL 5.6. Par conséquent, il ne produit pas l'erreur selon Documentation MYSQL 6 qui dit

MySQL vous permet de stocker une valeur "zéro" de "0000-00-00" comme "date fictive". Ceci est dans certains cas plus pratique que d'utiliser des valeurs NULL et utilise moins de données et d'espace d'index. Pour interdire '0000-00-00', activez le mode SQL NO_ZERO_DATE.

MISE À JOUR

Concernant la question du bogue comme l'a dit @Dylan-Su :

Je ne pense pas que ce soit le bogue, c'est la façon dont MYSQL a évolué au fil du temps en raison duquel certaines choses sont modifiées en fonction de l'amélioration du produit.

Cependant, j'ai un autre rapport de bogue lié concernant le NOW() fonction

Le champ Datetime n'accepte pas la valeur par défaut NOW()

Une autre remarque utile [voir Initialisation et mise à jour automatiques pour TIMESTAMP et DATETIME ]

Depuis MySQL 5.6.5, les colonnes TIMESTAMP et DATETIME peuvent être automatiquement initialisées et mises à jour à la date et à l'heure actuelles (c'est-à-dire l'horodatage actuel). Avant 5.6.5, cela n'est vrai que pour TIMESTAMP et pour au plus une colonne TIMESTAMP par table. Les notes suivantes décrivent d'abord l'initialisation et la mise à jour automatiques pour MySQL 5.6.5 et plus, puis les différences pour les versions antérieures à 5.6.5.

Mise à jour concernant NO_ZERO_DATE

À partir de MySQL à partir de 5.7.4, ce mode est obsolète. Pour la version précédente, vous devez commenter la ligne correspondante dans le fichier de configuration. Reportez-vous à la documentation MySQL 5.7 sur NO_ZERO_DATE