171 votes

MYSQL a tronqué une valeur DOUBLE incorrecte

Lorsque la requête SQL ci-dessous est exécutée :

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII' 
    AND name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

L'erreur suivante est soulevée :

1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'

Comment résoudre ce problème ?


shop_category la structure des tableaux :

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)

1 votes

Peut-on déterminer la signification réelle de ce message d'erreur et dans quels cas il apparaît ? Comme il apparaît dans des contextes où une valeur DOUBLE n'est pas impliquée, il semble quelque peu trompeur.

0 votes

Je suppose qu'il essaie de calculer la valeur BOOLEAN de 'Secolul XVI - XVIII' avant AND.

2 votes

Si vous avez "où x = 'x' et y", vous obtiendrez cette erreur obscure et mal conçue.

244voto

Darin Dimitrov Points 528142

Vous n'avez pas besoin de la AND mot-clé. Voici le syntaxe correcte de l'instruction UPDATE :

UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768

20 votes

Je suis vraiment content d'avoir trouvé cette réponse avant de jeter l'ordinateur contre un mur.

26 votes

Il s'agit donc bien d'une stupidité de la part de personnes comme moi qui commettent cette erreur, mais le message d'avertissement 'Truncated incorrect DOUBLE value' est plutôt inutile...

7 votes

En fait, chaque fois qu'il y a un problème de syntaxe, l'exception inutile "mysql-truncated-incorrect-double-value" est levée.

78voto

Sidra Points 91

J'ai eu cette exception non pas à cause de AND au lieu de la virgule, en fait j'avais cette exception juste parce que je n'utilisais pas d'apostrophes dans la clause where.

Comme ma requête était

update table set coulmn1='something' where column2 in (00012121);

quand j'ai changé la clause where en where column2 in ('00012121'); alors la requête a bien fonctionné pour moi.

2 votes

Même problème pour moi ! J'essayais de mettre à jour une table dans un CRM qui utilise 1 comme identifiant de l'utilisateur administrateur et 36 caractères pour tous les autres utilisateurs. Mon "where" spécifiait l'id utilisateur 1, sans les guillemets. Je pense que c'est lié au fait que mysql est en mode strict.

3 votes

@danny_mulvihill Je crois que vous êtes sur la bonne voie. J'avais STRICT_TRANS_TABLES en sql_mode et en essayant de mettre à jour un champ limité avec (ce qui semblait être) une valeur numérique dans le champ where La clause a généré une erreur. En changeant de mode, un avertissement est apparu, mais la mise à jour n'a toujours pas été appliquée. Après un examen plus approfondi, la colonne utilisée dans la clause where, bien qu'elle n'ait que des valeurs apparemment entières, était en fait une colonne de type varchar(20)

0 votes

Même problème pour moi. Un 'select * from t where id = 6503' a fonctionné correctement mais 'update t set a = "foo" where id = 6503' a donné lieu à ERROR 1292 (22007) : Truncated incorrect DOUBLE value : '234805557438#'. id ressemble à un integer mais est un varchar. Le fait de citer la valeur dans la mise à jour a résolu le problème. 'update t set a = "foo" where id = "6503"'

30voto

Bob Kruithof Points 1030

En gros, il s'agit de

C'est une syntaxe incorrecte qui fait que MySQL pense que vous essayez de faire quelque chose avec une colonne ou un paramètre qui a le type incorrect "DOUBLE".

Apprenez de mon erreur

Dans mon cas, j'ai mis à jour la colonne varchar dans une table. NULL où la valeur 0 debout. Ma requête de mise à jour était la suivante :

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Maintenant, puisque le type réel de myValue es VARCHAR(255) cela donne l'alerte :

+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'value xyz' |
+---------+------+-----------------------------------------------+

Et maintenant myTable est pratiquement vide, car myValue est maintenant NULL pour CHAQUE ligne du tableau ! Comment cela s'est-il produit ?
*cris interne*

Plus de 30k lignes ont maintenant des données manquantes.
*les cris intérieurs s'intensifient*

Dieu merci pour les sauvegardes. J'ai pu récupérer toutes les données.
*l'intensité des cris intérieurs diminue*

La requête corrigée est la suivante :

UPDATE myTable SET myValue = NULL WHERE myValue = '0';
                                                  ^^^
                                                  Quotation here!

J'aimerais que ce soit plus qu'un simple avertissement pour qu'il soit moins dangereux d'oublier ces citations.

*Fin des cris internes*

13voto

codaddict Points 154968

Essayez de remplacer le AND avec ,

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

En Syntaxe UPDATE montre la virgule doit être utilisée comme séparateur.

1 votes

Cela a marché pour moi, +1 pour cela :)

6voto

Adrian Goia Points 83

Ce sont principalement les chaînes de requête invalides qui donnent lieu à cet avertissement.

Erreur due à une subtile erreur de syntaxe (parenthèse droite mal placée) lors de l'utilisation de INSTR fonction :

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active'>0);

Correct :

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active')>0;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X