int, bigint, smallint et tinyint (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in Microsoft Fabric

Types de données représentant des valeurs numériques exactes qui utilisent des entiers. Pour économiser de l’espace dans la base de données, utilisez le plus petit type de données qui peut contenir de manière fiable toutes les valeurs possibles. Par exemple, tinyint serait suffisant pour l’âge d’une personne, car personne ne vit plus de 255 ans. Mais tinyint n’est pas suffisant pour l’âge d’un bâtiment, car un bâtiment peut avoir plus de 255 ans.

Type de données Plage Expression de plage Stockage
bigint -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807 -2^63 à 2^63-1 8 octets
int -2 147 483 648 à 2 147 483 647 -2^31 à 2^31-1 4 octets
smallint -32 768 à 32 767 -2^15 à 2^15-1 2 octets
tinyint 0 à 255 2^0-1 à 2^8-1 1 octet

Notes

Le type de données int est le type de données integer principal dans SQL Server. Le type de données bigint est destiné à être utilisé quand les valeurs entières sont susceptibles de ne pas appartenir à la plage prise en charge par le type de données int.

bigint s’insère entre smallmoney et int dans le graphique de priorité des types de données.

Les fonctions retournent bigint uniquement si l’expression de paramètre est un type de données bigint. SQL Server ne promeut pas automatiquement d’autres types de données entiers (tinyint, smallint et int) en bigint.

Conversion et paramétrage

Lorsque vous utilisez les +-opérateurs arithmétiques ou *% /implicites pour effectuer une conversion implicite ou explicite d’int, smallint, tinyint ou des valeurs constantes bigint en types de données float, réel, décimal ou numérique, les règles appliquées par SQL Server lorsqu’il calcule le type de données et la précision des résultats d’expression diffèrent selon que la requête est autoparamètre ou non.

Par conséquent, des expressions similaires dans les requêtes peuvent parfois produire des résultats différents. Lorsqu’une requête n’est pas autoparamètre, la valeur constante est d’abord convertie en décimale, dont la précision est juste assez grande pour contenir la valeur de la constante, avant de la convertir en type de données spécifié. Par exemple, la valeur 1 constante est convertie en décimale (1,0) et la valeur 250 constante est convertie en décimale (3,0).

Lorsqu’une requête est automatiquement paramétrée, la valeur constante est toujours convertie en décimales (10,0) avant de passer au type de données final. Lorsque l'opérateur / est impliqué, outre la précision du type de résultat, la valeur de résultat peut aussi différer parmi des requêtes similaires. Par exemple, la valeur de résultat d’une requête autoparameterisée qui inclut l’expression SELECT CAST (1.0 / 7 AS float), diffère de la valeur de résultat de la même requête qui n’est pas paramétrée automatiquement, car les résultats de la requête autoparamètre sont tronqués pour s’adapter au type de données décimal (10,0).

Le type de données tinyint n’est pas pris en charge dans Microsoft Fabric.

Convertir des données entières

Lorsque les entiers sont implicitement convertis en type de données caractère, si l’entier est trop grand pour s’adapter au champ de caractères, SQL Server utilise le caractère ASCII 42, l’astérisque (*).

Les constantes entières supérieures à 2 147 483 647 sont converties en type de données decimal, et non bigint. L’exemple suivant montre que, quand la valeur de seuil est dépassée, le type de données du résultat passe de int à decimal.

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2;

Voici le jeu de résultats.

Result1      Result2
-----------  ------------------
1073741823   1073741824.500000

Exemples

L’exemple suivant crée une table à l’aide des types de données bigint, int, smallint et tinyint. Les valeurs sont insérées dans chaque colonne et retournées dans l'instruction SELECT.

CREATE TABLE dbo.MyTable (
    MyBigIntColumn BIGINT,
    MyIntColumn INT,
    MySmallIntColumn SMALLINT,
    MyTinyIntColumn TINYINT
);
GO

INSERT INTO dbo.MyTable
VALUES (
    9223372036854775807,
    2147483647,
    32767,
    255
);
GO

SELECT MyBigIntColumn,
    MyIntColumn,
    MySmallIntColumn,
    MyTinyIntColumn
FROM dbo.MyTable;

Voici le jeu de résultats.

MyBigIntColumn       MyIntColumn MySmallIntColumn MyTinyIntColumn
-------------------- ----------- ---------------- ---------------
9223372036854775807  2147483647  32767            255