J'exécute MySql Server 5.7.11 et cette phrase:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
est pas de travail. Donner l'erreur:
ERROR 1067 (42000): Invalid default value for 'updated'
Mais ce qui suit:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
fonctionne juste .
Même cas pour DATE.
En guise de remarque , il est mentionné dans la documentation MySQL :
Le type DATE est utilisé pour les valeurs avec une partie date mais aucune partie heure. MySQL récupère et affiche les valeurs DATE au format «AAAA-MM-JJ». La plage prise en charge va de «1000-01-01» à «9999-12-31».
même s'ils disent aussi:
Les valeurs DATE, DATETIME ou TIMESTAMP non valides sont converties en valeur «zéro» du type approprié («0000-00-00» ou «0000-00-00 00:00:00»).
Ayant également pris en compte la deuxième citation de la documentation MySQL, quelqu'un pourrait-il me dire pourquoi il donne cette erreur?
NULL
sert.Réponses:
L'erreur est due au mode sql qui peut être le mode strict selon la dernière documentation MYSQL 5.7
MySQL Documentation 5.7 dit :
Pour vérifier le mode MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Désactivation du mode STRICT_TRANS_TABLES
Cependant pour 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 commandePar commande
SET sql_mode = '';
ou
SET GLOBAL sql_mode = '';
L'utilisation du mot-clé
GLOBAL
nécessite des précisions et affecte les opérations auxquelles tous les clients se connectent à partir de ce momentsi ci-dessus ne fonctionne pas, allez à
/etc/mysql/my.cnf
(selon ubuntu) et commentezSTRICT_TRANS_TABLES
En outre, si vous voulez régler définitivement le mode sql au démarrage du serveur puis inclure
SET sql_mode=''
dansmy.cnf
sous Linux ou MacOS. Pour Windows, cela doit être fait dans unmy.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 la documentation MYSQL 6 qui dit
METTRE À JOUR
En ce qui concerne le problème du bug, comme l'a dit @ Dylan-Su:
Je ne pense pas que ce soit le bogue de 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 concernant la
NOW()
fonctionLe champ Datetime n'accepte pas la valeur par défaut NOW ()
Une autre note utile [voir Initialisation et mise à jour automatiques pour TIMESTAMP et DATETIME ]
Mise à jour concernant NO_ZERO_DATE
Depuis MySQL à partir de la version 5.7.4, ce mode est obsolète. Pour la version précédente, vous devez commenter la ligne respective dans le fichier de configuration. Reportez-vous à la documentation MySQL 5.7 le NO_ZERO_DATE
la source
STRICT_TRANS_TABLES
pour mes deux instances MySQL, locales et serveur. Cependant, je peux facilement insérer0000-00-00
dans mon instance locale, mais pas dans mon instance de serveur - une erreur est générée. Pourquoi? Parce que la configuration de mon serveur MySQL a étéNO_ZERO_DATE
activée. Et mon local ne l'a pas.NO_ZERO_DATE
J'ai eu cette erreur avec WAMP 3.0.6 avec MySql 5.7.14.
Solution :
changer la ligne 70 (si votre fichier ini n'est pas touché) dans le
c:\wamp\bin\mysql\mysql5.7.14\my.ini
fichier deà
et redémarrez tous les services.
Cela désactivera le mode strict. Selon la documentation, «mode strict» signifie un mode avec l'un ou les deux
STRICT_TRANS_TABLES
ouSTRICT_ALL_TABLES
activé. La documentation dit:la source
Je me suis retrouvé dans une situation où les données étaient mélangées entre NULL et 0000-00-00 pour un champ de date. Mais je ne savais pas comment mettre à jour le '0000-00-00' en NULL, car
n'est plus autorisé. Ma solution de contournement était assez simple:
car toutes les
my_date_field
valeurs incorrectes (que les dates soient correctes ou non) étaient antérieures à cette date.la source
<'0000-01-01'
puisqu'il s'agit bien sûr d'une date valide.Problème de syntaxe de configuration
Sur certaines versions de MYSQL (testé 5.7. *) Sous les systèmes * nix, vous devez utiliser cette syntaxe:
Cela ne fonctionnera pas:
tiret sans guillemets
soulignement sans guillemets
soulignement et citations
Un examen plus complet des valeurs de configuration et du mode sql:
Comment configurer des indicateurs de mode SQL permanents
la source
Sélectionnez d'abord la session en cours
sql_mode
:Ensuite, vous obtiendrez quelque chose comme cette valeur par défaut :
puis définissez
sql_mode
sans'NO_ZERO_DATE'
:Si vous avez des subventions, vous pouvez le faire aussi pour
GLOBAL
:la source
Ajoutez simplement la ligne:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
fichier intérieur:
/etc/mysql/mysql.conf.d/mysqld.cnf
puis
sudo service mysql restart
la source
SELECT @@SESSION.sql_mode;
abord, et leur supprimer NO_ZERO_IN_DATE, NO_ZERO_DATE et STRICT_TRANS_TABLES de ce qu'il vous donne. De cette façon, vous conservez tous les autres paramètres que vous avez activés. J'avais beaucoup plus que ces deux éléments définis pour mon mode SQL. Je ne sais pas ce qu'ils font tous, mais je ne veux pas risquer de les supprimer à ce stade.Cela fonctionne pour 5.7.8:
Vous pouvez créer un SQLFiddle pour recréer votre problème.
http://sqlfiddle.com/
Si cela fonctionne pour MySQL 5.6 et 5.7.8, mais échoue sur 5.7.11. Ensuite, il s'agit probablement d'un bogue de régression pour 5.7.11.
la source
Pour résoudre le problème avec MySQL Workbench (après avoir appliqué la solution côté serveur):
Supprimez SQL_MODE en TRADITIONAL dans le panneau des préférences.
la source
Cette réponse est juste pour MySQL 5.7:
Best n'est pas vraiment mis en blanc le sql_mode, utilisez plutôt en PHP une variable de session avec:
Donc au moins vous gardez les autres valeurs par défaut.
C'est fou que la documentation mysql ne soit pas claire, vous devez supprimer ces valeurs par défaut dans sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, je comprends, mais dans les versions futures, cela sera abandonné.
STRICT_ALL_TABLES, avec ceci, avant que les paramètres ne soient ignorés, vous devez donc le supprimer également.
Enfin TRADITIONNEL aussi, mais la documentation parle de ce paramètre: "donner une erreur au lieu d'un avertissement" lors de l'insertion d'une valeur incorrecte dans une colonne ", avec ce paramètre, les dates avec des valeurs nulles ne sont pas insérées, mais sans oui.
MySQL n'est pas vraiment organisé avec ces paramètres et ces combinaisons.
la source
Combinaisons d'options pour
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Ne lance pas:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Jette:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Mes paramètres
/etc/mysql/my.cnf
sur Ubuntu:la source
la source
Dans le répertoire xamp / mysql / bin Ouvrez "my.ini" et changez la ligne: Sql_node for ->
"sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
SUPPRIMER "NO_ZERO_IN_DATE"
la source