FirebirdSQL logo

Types de données à virgule fixe

Ces types de données permettent de les utiliser pour stocker des valeurs monétaires et fournissent une prévisibilité pour les opérations de multiplication et de division.

Firebird propose deux types de données à virgule fixe : NUMERIC et DECIMAL.Selon la norme, les deux types limitent le nombre stocké à une échelle déclarée (le nombre de décimales).Cependant, l’approche de la contrainte de précision est différente pour les types : pour les colonnes NUMERIC, la précision est aussi quedéclaré", tandis que les colonnes `DECIMAL peuvent recevoir des nombres dont la précision est au moins égale à ce qui a été déclaré.

Par exemple, NUMERIC(4, 2) décrit un nombre composé d’un total de quatre chiffres dont 2 chiffres après la virgule ; total 2 chiffres avant la virgule, 2 après.Si vous écrivez une valeur de 3.1415 dans une colonne avec ce type de données, la colonne NUMERIC(4, 2) conservera la valeur 3.14.

Pour les données à virgule fixe, ce qui est commun est la forme de la déclaration, par exemple NUMERIC(p, s). Ce qu’il faut comprendre ici, c’est que dans cette entrée, "est l’échelle, et non le "nombre de décimales" intuitivement prévu.Pour "visualiser" le mécanisme de stockage des données, mémorisez vous-même la procédure :

  • Lors de la sauvegarde dans la base de données, le nombre est multiplié par 10 (10s), ce qui le transforme en un nombre entier ;

  • Lorsque les données sont lues, le nombre est reconverti en un nombre entier.

La manière dont les données sont physiquement stockées dans le SGBD dépend de plusieurs facteurs : la précision déclarée, le dialecte de la base de données et le type de déclaration.

Table 1. Une façon de stocker physiquement des nombres à virgule fixe
Précision Type de données Dialecte 1 Dialecte 3

1 - 4

NUMERIC

SMALLINT

SMALLINT

1 - 4

DECIMAL

INTEGER

INTEGER

5 - 9

NUMERIC ou DECIMAL

INTEGER

INTEGER

10 - 18

NUMERIC ou DECIMAL

DOUBLE PRECISION

BIGINT

19 - 38

NUMERIC ou DECIMAL

INT128

INT128

NUMERIC

Format déclarative des données
  NUMERIC
| NUMERIC(precision)
| NUMERIC(precision, scale)
Table 1. Paramètres de type NUMERIC
Paramètre ^^ Description

precision

Précision. Peut être compris entre 1 et 38.Le paramètre par défaut est 9.

scale

Scale. Peut aller de 0 à précision.Le paramètre par défaut est 0.

En fonction de la précision precision et de l’échelle scale, le SGBD stocke les données différemment.

Voici des exemples de la manière dont un SGBD stocke les données en fonction de la forme sous laquelle elles sont déclarées :

NUMERIC(4)    stored as   SMALLINT (exact data)
NUMERIC(4,2)              SMALLINT (data * 102)
NUMERIC(10,4) (Dialect 1) DOUBLE PRECISION
              (Dialect 3) BIGINT (data * 104)
NUMERIC(38, 6)            INT128 (data * 106)
Caution

N’oubliez jamais que le format de stockage des données dépend de leur précision.Par exemple, vous avez spécifié un type de colonne NUMERIC(2, 2), en supposant que la plage de valeurs de cette colonne sera -0.99…​0.99.Cependant, en réalité, la plage de valeurs de la colonne serait de -327,68…​327,67, ce qui est dû au stockage du type de données NUMERIC(2, 2) au format SMALLINT.En fait, les types de données NUMERIC(4, 2), NUMERIC(3, 2) et NUMERIC(2, 2) sont les mêmes.

Ainsi, pour réellement stocker des données dans une colonne dont le type de données est NUMERIC(2, 2) dans la plage -0,99…​0,99, vous devez créer une limite pour celle-ci.