[MySQL] MySQL 5 est fou ou c'est moi ?

35 réponses
AuteurMessage

Rano |
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:03

Bonjour,

J'ai un enregistrement avec :
id = 1 (int 11)
ttc = 10.80 (float 5,2)
etat = 0 (int)

Je fais un :
UPDATE truc
SET etat = '1'
WHERE id = '1'
AND ttc = '10.8'

Il ne modifie rien :|

Si je mets :
AND ttc > 10.8

Ca modifie ...

Par contre, si dans mon enregistrement j'ai 11 et que dans mon update, je fais
AND ttc = 11

Là ca fonctionne...

C'est quoi ce bordel ?

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

LePhasme | Guillaume
Membre

Photo de LePhasme

Inscrit le : 09/05/2005

# Le 23/01/2006 à 15:06

"UPDATE truc SET etat = 1 WHERE id = 1 AND ttc = 10,8"

et ca marche pas mon truc ?

Paris Apartments RentalsOuvrir dans une nouvelle fenetre Avertisseur Autonome de FumeeOuvrir dans une nouvelle fenetre ViadeoOuvrir dans une nouvelle fenetre

jerome347 | Jérôme
Membre

Photo de jerome347

Inscrit le : 09/05/2005

# Le 23/01/2006 à 15:06

ttc = 10.80
...
AND ttc = '10.8'

Ca colle pas

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 23/01/2006 à 15:06

c'est l'eternel probleme des float

10.80 n'est pas stocké en base comme 10.80 mais probablement comme 10.8000000001
Il faut arrondir a 2 chiffres dans la requete avant de faire le test

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 23/01/2006 à 15:08

C'est une erreur qui arrive a cause du type de la colone : FLOAT.

Pour rappel, les FLOAT ne sont pas precis, ton 10.8 peut très bien etre stoke en 10.8000000000000000001 pour MySQL et donc ne correspond pas a ta 1ere requete... mais bien a ta seconde !

Si tu veux des valeurs exactes, il faut utiliser DECIMAL

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:09

devtribu a dit :
c'est l'eternel probleme des float

10.80 n'est pas stocké en base comme 10.80 mais probablement comme 10.8000000001
Il faut arrondir a 2 chiffres dans la requete avant de faire le test


La requete d'insert ou d'update ?

Dans les deux la chaine exacte envoyée à mysql est
ttc = '10.80'

Et sur un float 5,2 je suis pas certain qu'il enregistre du 10.8000000001 normalement, si ?

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:09

Ok, bon ba je teste avec decimal alors, merci à vous deux

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 23/01/2006 à 15:10

UPDATE truc SET etat = 1 WHERE id = 1 AND round(ttc,2) = 10,8

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:11

et bein, c'est bordélique leur truc... J'avais jamais rencontré ce problème

Ca fait longtemps que j'avais pas appris un nouveau truc, merci

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:12

Mais c'est connu comme étant un bug le fait qu'il rajoute n'importe quoi après mon 10.80 pour le stocker ou ca parrait normal à tout le monde sauf moi ?

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 23/01/2006 à 15:12

Oui, moi mon premier reflexe a ete d'utiliser les float quand j'en ai eu besoin, et j'ai aussi eu des bugs... belle prise de tete avant de trouver la solution

Au final, je sais pas pourquoi ca reste et ce n'est pas remplace par DECIMAL partout, quel interet de garder cette approximation ?

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 23/01/2006 à 15:13

C'est inerant au systeme de stockage des float je crois

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 23/01/2006 à 15:13

C'est PAS un bug
c'est le format float qui est concu comme ca, dans tous les langages, dans tous les systemes, sur tous les OS.

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:14

Ma fois, à leur place (enfin si j'avais su coder comme eux ) j'aurais fait en sorte que si on a défini un float 5,2 ca corrige automatiquement comme a dit devtribu (round(ttc,2)) à la limite.

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 23/01/2006 à 15:15

le format DECIMAL n'est pas reconnu par tous les SGBD (dans mon souvenir, ca n'existe pas sur oracle ou sybase)
Mais c'est clair que sur mysql il est tres adapté et il faut pas s'en priver.

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:16

devtribu a dit :
C'est PAS un bug
c'est le format float qui est concu comme ca, dans tous les langages, dans tous les systemes, sur tous les OS.


Ba jamais eu ce problème avec du C ou C++ ou n'importe quel autre langage, à part les moteurs de MySQL... mais bon, si c'est normal hein, c'est pas grave

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 23/01/2006 à 15:16

It's not a bug, it's a feature

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

devtribu | Olivier
Modérateur

Photo de devtribu

Inscrit le : 16/06/2005

# Le 23/01/2006 à 15:17

Bool > j'adore cette phrase aussi

Février 2019, mon futur livre Tout JavaScript chez Dunod https://amzn.to/2PoLd0fOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 23/01/2006 à 15:18

lol

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 23/01/2006 à 15:20

rano> pareil, j'ai jamais eu de probleme avec un autre langage/moteur que mysql.

Donc meme si ce n'est pas un bug, c'est peut etre "plus mal" géré par MySQL ;)

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 7:07:16 | Généré en 13.37ms | Contacts | Mentions légales |