Articles

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

  • 09/08/2017
  • 3 minutes to read
    • M
    • j
    • c
    • M
    • i
    • +8

Applies to: ouiSQL Server (toutes les versions prises en charge) OuiBase de données SQL Azure OuiInstance gérée SQL Azure ouiAzure Synapse Analytics ouiEntrepôt de données parallèle

Types de données à nombre exact qui utilisent des données entières. Pour économiser de l’espace dans la base de données, utilisez le plus petit type de données pouvant 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 ne serait pas suffisant pour l’âge d’un bâtiment car un bâtiment peut avoir plus de 255 ans.

Data type Range Storage
bigint -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807) 8 Bytes
int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647) 4 Bytes
smallint -2^15 (-32,768) to 2^15-1 (32,767) 2 Bytes
tinyint 0 to 255 1 Byte

Remarques

Le type de données int est le type de données entier principal dans SQL Server. Le type de données bigint est destiné à être utilisé lorsque des valeurs entières peuvent dépasser la plage prise en charge par le type de données int.

bigint se situe entre smallmoney et int dans le graphique de priorité de type de données.

Les fonctions ne renvoient bigint que si l’expression du paramètre est un type de données bigint. SQL Server ne promeut pas automatiquement d’autres types de données entières (tinyint, smallint et int) vers bigint.

Attention

Lorsque vous utilisez les opérateurs arithmétiques +, -, *, / ou % pour effectuer une conversion implicite ou explicite des valeurs constantes int, smallint, tinyint ou bigint en types de données flottants, réels, décimaux ou numériques, les règles que SQL Server applique 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étrée 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étrée, la valeur constante est d’abord convertie en numérique, dont la précision est juste assez grande pour contenir la valeur de la constante, avant de la convertir au type de données spécifié. Par exemple, la valeur constante 1 est convertie en numérique (1, 0) et la valeur constante 250 est convertie en numérique (3, 0).

Lorsqu’une requête est autoparamétrée, la valeur constante est toujours convertie en numérique (10, 0) avant d’être convertie en type de données final. Lorsque l’opérateur / est impliqué, non seulement la précision du type de résultat peut différer entre des requêtes similaires, mais la valeur du résultat peut également différer. Par exemple, la valeur de résultat d’une requête autoparamétré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 autoparamétrée, car les résultats de la requête autoparamétrée sont tronqués pour s’adapter au type de données numérique (10, 0).

Conversion de données entières

Lorsque des entiers sont implicitement convertis en un type de données de caractères, si l’entier est trop grand pour entrer dans le champ de caractères, SQL Server entre 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 décimales, pas en type de données bigint. L’exemple suivant montre que lorsque la valeur de seuil est dépassée, le type de données du résultat passe d’un int à un décimal.

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 en utilisant les types de données bigint, int, smallint et tinyint. Les valeurs sont insérées dans chaque colonne et renvoyé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 (1 row(s) affected) 

Voir aussi

MODIFIER LA TABLE (Transact-SQL)
LANCER et CONVERTIR (Transact-SQL)
CRÉER UNE TABLE (Transact-SQL)
DÉCLARER @local_variable(Transact-SQL)
DÉFINIR @local_variable(Transact-SQL)
sys.types (Transact-SQL)