Comment utiliser MySQL DECIMAL?

177

Je ne peux pas tout à fait comprendre DECIMAL de MySQL. J'ai besoin que la ligne puisse contenir un nombre allant de 00,0001 à 99,9999. Comment pourrais-je le structurer pour qu'il fonctionne ainsi?

Charles Zink
la source
8
(Référence) dev.mysql.com/doc/refman/5.1/en/…
Pekka
4
Vous devriez vraiment accepter la bonne réponse. La réponse actuellement acceptée est fausse.
Olhovsky
2
Terminé ici et lu la réponse affirmant que DECIMAL UNSIGNED n'est pas possible. Voir la nouvelle réponse ci-dessous pour la spécification correcte pour cela.
Markus AO

Réponses:

439

Les colonnes DOUBLE ne sont pas les mêmes que les colonnes DECIMAL et vous aurez des problèmes si vous utilisez des colonnes DOUBLE pour les données financières.

DOUBLE n'est en fait qu'une version double précision (64 bits au lieu de 32 bits) de FLOAT . Les nombres à virgule flottante sont des représentations approximatives de nombres réels et ils ne sont pas exacts. En fait, les nombres simples comme 0.01 n'ont pas de représentation exacte dans les types FLOAT ou DOUBLE.

Les colonnes DECIMAL sont des représentations exactes, mais elles prennent beaucoup plus d'espace pour une gamme beaucoup plus petite de nombres possibles. Pour créer une colonne capable de contenir des valeurs de 0,0001 à 99,9999 comme vous l'avez demandé, vous auriez besoin de l'instruction suivante

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

La définition de la colonne suit le format DECIMAL (M, D) où M est le nombre maximum de chiffres (la précision ) et D est le nombre de chiffres à droite du point décimal (l' échelle ).

Cela signifie que la commande précédente crée une colonne qui accepte les valeurs comprises entre -99,9999 et 99,9999. Vous pouvez également créer une colonne DECIMAL NON SIGNÉE, allant de 0,0000 à 99,9999.

Pour plus d'informations sur MySQL DECIMAL, les documents officiels sont toujours une excellente ressource.

Gardez à l'esprit que toutes ces informations sont vraies pour les versions de MySQL 5.0.3 et supérieures. Si vous utilisez des versions précédentes, vous devriez vraiment mettre à niveau.

Alex Recarey
la source
17
A voté votre réponse. Votre réponse est correcte, l'autre réponse ne l'est pas (puisqu'elle prétend que "double = décimal"). DECIMAL est un type à virgule fixe avec une valeur exacte et ses synonymes sont NUMERIC, DEC et FIXED. Pas DOUBLE, car DOUBLE est un type à virgule flottante qui représente des valeurs de données numériques approximatives. Lorsque vous utilisez DECIMAL (<1-65>, <0-30>), le premier paramètre est le nombre de chiffres, le second le nombre de chiffres à droite du point décimal.
Norbert
2
Oui, tu as raison. Notez que cela fonctionne pour MySQL 5.0.3 et les versions ultérieures
ajreal
1
L'affiche a demandé un champ décimal contenant des valeurs comprises entre 0,0001 et 99,9999. J'ai ajouté des informations supplémentaires pour clarifier que le champ créé prend en charge les valeurs de -99,9999 à 99,9999. Merci pour les commentaires! Avertissement de version MySQL ajouté.
Alex Recarey
1
Vous avez dit "Il n'y a aucun moyen de créer une" colonne DECIMAL "non signée", mais votre exemple de code indique "DECIMAL (6,4) UNSIGNED NOT NULL". Pourquoi est-ce?
liang
3
@AlexRecarey Je semble être capable de créer un DECIMAL UNSIGNED très bien; et le manuel pour MySQL 5.x est d' accord: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Il renverra une erreur hors plage pour les valeurs négatives. Vous pouvez également créer FLOAT et DOUBLE non signés. Manuel: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO
67

Bien que les réponses ci-dessus semblent correctes, il suffit d'une simple explication pour vous donner une idée de son fonctionnement.

Supposons que votre colonne soit définie sur DECIMAL(13,4). Cela signifie que la colonne aura une taille totale de 13 chiffres dont 4 seront utilisés pour la représentation de précision.

Donc, en résumé, pour cette colonne, vous auriez une valeur maximale de: 999999999.9999

Cristiano
la source
1
meilleure réponse ici
Julian Silvestri
15

Il existe des solutions correctes dans les commentaires, mais pour les résumer en une seule réponse:

Vous devez utiliser DECIMAL (6,4).

Ensuite, vous pouvez avoir 6 chiffres au total, 2 avant et 4 après la virgule décimale (l'échelle). Au moins d'après cela .

Zoltán Hajdú
la source
6

MySQL 5.x spécification pour le type de données décimal est: DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. La réponse ci-dessus est erronée en disant que les décimales non signées ne sont pas possibles.

Pour définir un champ permettant uniquement les décimales non signées, avec une longueur totale de 6 chiffres, dont 4 décimales, utilisez: DECIMAL (6,4) UNSIGNED.

Vous pouvez également créer des types de données FLOAT et DOUBLE non signés (c'est-à-dire non négatifs).

Markus AO
la source