Windows MySQL v5 génère une erreur, mais Linux et les autres versions ne génèrent qu'un avertissement. Cela doit être corrigé. WTF ?
Voir également une tentative de résolution de ce problème en tant que bogue n° 19498 dans le MySQL Bugtracker :
Bryce Nesbitt le 4 avril 2008 16h36 :
Sous MS Windows, la règle "pas de DEFAULT" est une erreur, alors que sur d'autres plates-formes, il s'agit souvent d'un avertissement. Bien qu'il ne s'agisse pas d'un bogue, il est possible d'être piégé par cela si vous écrivez du code sur une plate-forme indulgente, puis que vous l'exécutez plus tard sur une plate-forme stricte :
Personnellement, je considère cela comme un bug. La recherche de "la colonne BLOB/TEXT ne peut pas avoir de valeur par défaut" renvoie environ 2 940 résultats sur Google. La plupart d'entre eux sont des rapports d'incompatibilités lors de la tentative d'installation de scripts de base de données qui fonctionnaient sur un système mais pas sur d'autres.
Je rencontre actuellement le même problème sur une application Web que je modifie pour l'un de mes clients, déployée à l'origine sur Linux MySQL v5.0.83-log. J'utilise Windows MySQL v5.1.41. Même en essayant d'utiliser la dernière version de phpMyAdmin pour extraire la base de données, il ne signale pas de valeur par défaut pour la colonne de texte en question. Pourtant, lorsque j'essaie d'exécuter une insertion sous Windows (qui fonctionne correctement sur le déploiement Linux), je reçois une erreur sans valeur par défaut sur la colonne ABC. J'essaie de recréer la table localement avec la valeur par défaut évidente (basée sur une sélection de valeurs uniques pour cette colonne) et je finis par recevoir la colonne si utile BLOB/TEXT ne peut pas avoir de valeur par défaut .
Encore une fois, ne pas maintenir la compatibilité de base entre les plates-formes est inacceptable et constitue un bogue.
Comment désactiver le mode strict dans MySQL 5 (Windows) :
-
Modifiez /my.ini et recherchez la ligne
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
-
Remplacez-le par
sql_mode='MYSQL40'
-
Redémarrez le service MySQL (en supposant qu'il s'agit de mysql5)
net stop mysql5 net start mysql5
Si vous avez un accès root/admin, vous pourrez peut-être exécuter
mysql_query("SET @@global.sql_mode='MYSQL40'");