Les systèmes de gestions de bases de données (SGBD) ont des limites bien définies pour chaque type de données. Il convient de connaître les valeurs minimums et maximums pour établir correctement le type de chaque colonne. Une colonne qui possède le bon type vis-à-vis des données qu’elle contient aura de bonnes performances et évitera les bugs où les données dépassent la limite établie. Cet article présente les limites des types entiers en SQL.
Types numériques pour MySQL, PostgreSQL, SQL Server …
Les données de types numériques peuvent en général être enregistré dans un colonne de type tinyint, smallint, int ou bigint. Cependant, il faut se fier à la documentation de chaque systèmes pour savoir précisément les types existants. Le tableau ci-dessous présente les types existants dans chacun des plus grands systèmes existants:
Types de données | MySQL | PostgreSQL | SQL Server | DB2 | Firebird |
---|---|---|---|---|---|
TINYINT | ✔ | ✔ | ✔ | ||
SMALLINT / INT2 | ✔ | ✔ | ✔ | ✔ | ✔ |
MEDIUMINT | ✔ | ||||
INT / INTEGER / INT4 | ✔ | ✔ | ✔ | ✔ | ✔ |
BIGINT / INT8 | ✔ | ✔ | ✔ | ✔ | ✔ |
A savoir : Oracle stocke les données de type numérique uniquement sous un seul type appelé NUMERIC dont la valeur maximum est de 10125.
Valeurs limites des données numériques
Chacun des types de données présentés plus tôt est limité. Pour presque tous les systèmes les données numériques peuvent être négative (colonne signée), mais pour MySQL il est possible de stocker uniquement des valeurs numériques positives (colonne non-signée) ce qui augmente la limite maximum.
Types | Taille (en octet) | Valeur min | Valeur max |
---|---|---|---|
TINYINT TINYINT (unsigned) | 1 | -128 0 | 127 255 |
SMALLINT / INT2 SMALLINT / INT2 (unsigned) | 2 | -32.768 0 | 32.767 65.535 |
MEDIUMINT MEDIUMINT (unsigned) | 3 | -8.388.608 0 | 8.388.607 16.777.215 |
INT / INTEGER / INT4 INT / INTEGER / INT4 (unsigned) | 4 | -2.147.483.648 0 | 2.147.483.647 4.294.967.295 |
BIGINT / INT8 BIGINT / INT8 (unsigned) | 8 | -9.223.372.036.854.775.808 0 | 9.223.372.036.854.775.807 18.446.744.073.709.551.615 |
A noter (SQL Server) : le tinyint de SQL Server est non-signé (unsigned) ce qui fait que les valeurs vont de 0 à 255.
A noter (PostgreSQL) : les types INT2, INT4 et INT8 sont spécifiques à PostgreSQL. N’essayez pas de les chercher sur un autre systèmes de gestion de base de données.
Bien sélectionner le bon type
En fonction des données à stocker il est important de bien choisir le type d’une colonne. Les données stockées seront les mêmes mais l’espace sur le disque sera différent. Pour faire une analogie, c’est comme s’il faut stocker une boite d’allumette soit dans un tiroir ou soit dans un entrepôt. Tout un entrepôt pour stocker uniquement une boite d’allumette, c’est un peu trop. Toutefois, s’il faut stocker plusieurs milliers de boites d’allumettes, un simple tiroir ne va pas suffire et l’entrepôt est plus approprié.
Choisir le bon type de données permet d’améliorer un petit peu les performances. Mais il faut faire attention, car une application qui sous-estime les données à stockée aura un bug s’il faut enregistrer plus d’information que prévu.
Le premier exemple concret est celui d’un blog peut avoir un bug si les commentaires sont stockés sont stockés sur une table qui utilisent un ID de type smallint et qu’il y a plus de 32.767 commentaires dans la table.
Prenons un exemple pour illustrer ces propos. Imaginons un blog qui utilise MySQL et qui possède une table qui contient les commentaires postés par les internautes. Un champ de cette table stocke les ID qui s’incrémentent à chaque nouveau commentaire. Cela ne sert à rien de choisir un type signé puisque l’ID sera toujours supérieur à zéro.
Par ailleurs, imaginons que l’ID soit stocké sur un smallint unsigned (0 à 65.536). Si le blog à beaucoup de succès, il y aura un bug le jour où la limite de 65.536 commentaires sera atteinte. Pour un petit blog amateur ça suffit largement, mais pour un site qui a d’énorme ambition et qui potentiellement se fait beaucoup spammé, ce chiffre peut être atteins plus rapidement que prévu.
[…] Pour en savoir plus : valeurs max des données numériques en SQL […]