2010-10-19 13 views
2

J'ai un système qui fonctionne sur des centaines de sites Web et je reçois une erreur pour la première fois. J'espérais que quelqu'un pourrait me dire ce qui pourrait causer cette erreur afin que je puisse essayer de l'enlever.MySQL - MySQLi et l'histoire d'une erreur mystérieuse

Le problème survient lorsque vous essayez d'ajouter une page.

INSERT INTO pages (parent, name, type, sort) VALUES ('0', 'test', 'text', '37.5'); 

Cela provoque le message d'erreur suivant. Je pensais que cela pouvait être basé sur le code, donc j'ai téléchargé phpMyAdmin et l'erreur persistait.

Il existe un champ TEXT appelé text. Cela n'a pas de valeur par défaut, mais il n'en a jamais eu besoin. Cela a bien fonctionné sans un jusqu'à présent.

Lorsque j'essaie de définir le champ par défaut sur ce serveur, j'obtiens l'erreur suivante.

#1101 - BLOB/TEXT column 'text' can't have a default value 

Fondamentalement, la question est - que se passe-t-il?

Est-ce que MySQLi est différent de MySQL? Cela pourrait-il être la cause.

Mon serveur exécute mysql 5.0.5, ce serveur exécute mysql 5.0.51a. Puis-je supposer que ce n'est pas la cause?

Est-ce que quelqu'un a des idées ou même des suppositions quant à la cause de cette situation?

+2

Je ne sais pas ce qui se passe, mais je pense que renommer la colonne 'text' en quelque chose d'autre serait une bonne idée en tant que première mesure: il est imprudent de nommer les colonnes après les mots réservés. –

Répondre

0

Si votre champ nommé 'texte' n'est pas nullable, vous devrez insérer une valeur s'il n'y a pas de valeur par défaut. Je ne sais pas pourquoi il y a une différence de comportement entre les deux versions. MySQLi est juste la version du pilote MySQL qui fonctionne sur les versions ultérieures de MySQL (je pense> = 4.1, mais je ne m'en souviens pas à coup sûr).

0

Si le champ text se trouve dans la table dans laquelle vous insérez et qu'il ne peut pas être NULL, vous devez définir sa valeur. Si ce n'est pas le cas, une valeur par défaut sera définie et aucune valeur par défaut, comme vous le voyez. Essayez d'utiliser des accents graves pour échapper au mot réservé, et l'insertion d'une valeur, comme suit:

INSERT INTO pages (parent, name, type, sort, `text`) VALUES ('0', 'test', 'text', '37.5', ''); 
+0

Je comprends cela, mais cela fonctionne très bien sur des centaines de serveurs. Je ne comprends pas pourquoi c'est différent. Les mécanismes, les requêtes et tout le reste sont les mêmes. – JasonS

+0

Faites un 'show create table pages' sur le 'mauvais' serveur et comparez-le à un 'bon' serveur. Cela va cracher le DDL exact nécessaire pour recréer les deux tables, et vous pouvez chercher des différences. –

1

Je sais que c'est une vieille question, mais j'eu un problème similaire et trouvé à cette question via Google sans réponse, Dans mon cas, j'essayais d'exécuter un panier sur ma machine locale, et j'ai continué à obtenir des erreurs de base de données comme celle mentionnée dans la question. J'utilisais MySQL 5.5.12 et il s'avère que le php dans mon panier d'achat était écrit pour une version plus ancienne de MySQL, et cela continuait à signaler des erreurs et des incompatibilités. Je ne vais pas suggérer si vous avez un problème similaire à déclasser, heureusement ce n'est pas nécessaire!

Ce qui est nécessaire ici est pour vous désactiver le mode strict MySQL qui provoque les problèmes de compatibilité. Pour ce faire tout ce que vous devez faire est de lancer la requête suivante via phpMyAdmin/SQLyog (ou interface choisie):

SET @@global.sql_mode=''; 

Juste pour préciser que deux est apostrophes (').

Reportez-vous à ce site pour plus d'informations ou d'autres façons de désactiver le mode strict MySQL: http://nickbartlett.com/wordpress/how-to-turn-off-mysql-strict-mode/

0

a couru dans ce même problème lors du débogage d'une application héritée et a été en mesure de le résoudre en allant dans mon fichier de configuration MySQL (my.cnf sur mon mac, mais probablement my.ini sur windows si c'est comme ça) et en commentant la ligne sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES en bas du fichier. Redémarrez mysql une fois ceci fait pour que le changement prenne effet.