web-dev-qa-db-fra.com

Comment insérer DECIMAL dans la base de données MySQL

J'ai une table de base de données avec certains champs, l'un d'eux, cost, est défini sur le type de données DECIMAL. J'ai défini les paramètres sur 4,2, qui devrait autoriser 4 chiffres avant la virgule décimale et 2 après.

(On m'a dit que le 4 voici le montant total, et le 2 est le montant après la décimale, quelqu'un pourrait-il clarifier cela sur une note latérale?)

Lorsque j'insère des données via une demande POST (la valeur 3.80 par exemple) les données stockées dans ma base de données sont en fait 99.99.

Que fais-je de mal pour provoquer cela?

Voici le tableau:

CREATE TABLE IF NOT EXISTS `mytable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(256) NOT NULL,
`cost` decimal(4,2) NOT NULL,
PRIMARY KEY (`id`)
)

Voici ma requête d'ajout:

INSERT INTO mytable (`id`,`title`,`cost`) 
VALUES (0, 'test title', '3.80')

Mise à jour: Cela fonctionne après avoir changé 4,2 en 6,2

26
Alex

Les types décimaux MySql sont un peu plus compliqués que juste à gauche et à droite du séparateur décimal.

Le premier argument est la précision , qui est le nombre total de chiffres. Le deuxième argument est l'échelle qui est le nombre maximum de chiffres à droite de la virgule décimale.

Ainsi, (4,2) Peut aller de -99.99 À 99.99.

Quant à savoir pourquoi vous obtenez 99.99 Au lieu du 3.80 Souhaité, la valeur que vous insérez doit être interprétée comme supérieure à 99.99, Donc la valeur maximale est utilisée. Vous pouvez peut-être publier le code que vous utilisez pour insérer ou mettre à jour le tableau.

Modifier

Correction d'un malentendu sur l'utilisation de l'échelle et de la précision, par http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html .

34
JYelton

Oui, 4,2 signifie "4 chiffres au total, dont 2 après la décimale". Cela se traduit par un nombre au format 00.00. Au-delà, vous devrez nous montrer votre requête SQL. PHP ne traduira pas 3,80 en 99,99 sans bonne raison. Peut-être que vous avez désaligné vos champs/valeurs dans la requête et que vous essayez d'insérer un plus grand nombre qui appartient à un autre champ.

7
Marc B

J'ai remarqué autre chose à propos de votre codage .... regardez

INSERT INTO reports_services (id,title,description,cost) VALUES (0, 'test title', 'test decription ', '3.80')

dans votre code "CREATE TABLE", vous avez défini l'ID sur "AUTO_INCREMENT", ce qui signifie qu'il génère automatiquement un résultat pour ce champ .... mais dans votre code ci-dessus, vous l'incluez comme l'une des insertions et dans les "VALUES" vous ayez un 0 là ... idk si c'est votre façon de nous dire que vous l'avez laissé vide car il est réglé sur AUTO_INC. ou si c'est le code réel que vous avez ... si c'est le code que vous avez non seulement si vous n'essayez pas d'envoyer des données à un ensemble de champs pour les générer automatiquement, mais la BONNE FAÇON de le faire FAUX serait

'0',

tu mets

0,

lol .... donc cela pourrait être à l'origine du problème ... J'ai également remarqué dans le code après la "description du test" que vous avez un espace avant le '.... qui pourrait aussi jeter quelque chose ... . idk .. J'espère que cela aide n résout peut-être un autre problème dont vous pourriez vous arracher les cheveux maintenant .... en parlant de ... J'ai besoin de comprendre mon problème avant de déchirer tous mes cheveux .. ... bonne chance.. :)

MISE À JOUR.....

J'ai presque oublié ... si vous avez le 0 pour montrer qu'il est vide ... vous pouvez entrer "titre du test" comme identifiant et "description du test" comme titre puis "3. quel que soit le centime" pour la description en laissant "coût" vide ...... ce qui pourrait être la raison pour laquelle il a atteint son maximum parce que si je ne me trompe pas, vous l'avez défini sur NOT NULL .... et vous l'avez laissé nul ... alors il a forcé quelque chose ... Peut être lol

4
Optiq