int, bigint, smallint et tinyint (Transact-SQL)
S’applique à : point de terminaison d’analytique SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL Analytics dans Microsoft Fabric Warehouse dans 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 obtenu.
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 obtenu.
MyBigIntColumn MyIntColumn MySmallIntColumn MyTinyIntColumn
-------------------- ----------- ---------------- ---------------
9223372036854775807 2147483647 32767 255