Condividi tramite


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

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di analisi (PDW)Endpoint di analisi SQL in Microsoft FabricMagazzino in Microsoft FabricDatabase SQL in Microsoft Fabric

Tipi di dati numerici esatti che utilizzano dati integer. Per risparmiare spazio nel database, usare il tipo di dati più piccolo che può contenere in modo affidabile tutti i valori possibili. Ad esempio, tinyint sarebbe sufficiente per una tabella di ricerca di piccole dimensioni con valori di stato, perché può archiviare fino a 256 righe. Ma tinyint non è sufficiente per un elenco di dipendenti, perché l'azienda potrebbe avere centinaia o migliaia di dipendenti.

Tipo di dati Range Espressione di intervallo Storage
bigint Da -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 -2^63 a 2^63-1 8 byte
int Da -2.147.483.648 a 2.147.483.647 -2^31 a 2^31-1 4 byte
smallint Da -32.768 a 32.767 -2^15 a 2^15-1 2 byte
tinyint da 0 a 255 Da 2^0-1 a 2^8-1 1 byte

Remarks

Il tipo di dati int è il tipo di dati integer primario in SQL Server. Il tipo di dati bigint è stato progettato per essere utilizzato quando i valori interi potrebbero non rientrare nell'intervallo supportato dal tipo di dati int.

Nell'ordine di precedenza dei tipi di dati bigint è compreso tra i tipi di dati smallmoney e int.

Le funzioni restituiscono bigint solo se l'espressione per il parametro è un tipo di dati bigint. SQL Server non promuove automaticamente altri tipi di dati integer (tinyint, smallint e int) a bigint.

Conversione e parametrizzazione

Quando si usano gli +operatori aritmetici , -*/, , o % per eseguire la conversione implicita o esplicita di valori costanti int, smallint, tinyint o bigint nei tipi di dati float, real, decimal o numerici, le regole che SQL Server applica quando calcola il tipo di dati e la precisione dei risultati dell'espressione variano a seconda che la query sia autoparametrizzata o meno.

Per questo motivo, in alcuni casi espressioni simili nelle query possono dare risultati diversi. Quando una query non viene parametrizzata automaticamente, il valore costante viene prima convertito in decimale, la cui precisione è sufficiente per contenere il valore della costante, prima di eseguire la conversione nel tipo di dati specificato. Ad esempio, il valore 1 costante viene convertito in decimal(1,0) e il valore 250 costante viene convertito in decimal(3,0).

Quando una query viene parametrizzata automaticamente, il valore costante viene sempre convertito in decimal(10,0) prima di eseguire la conversione nel tipo di dati finale. Se viene utilizzato l'operatore /, sia la precisione del tipo di risultati che il valore del risultato di query simili possono essere diversi. Ad esempio, il valore del risultato di una query con parametri automatici che include l'espressione SELECT CAST (1.0 / 7 AS float), differisce dal valore del risultato della stessa query che non viene parametrizzato automaticamente, perché i risultati della query con parametri automatici vengono troncati per adattarsi al tipo di dati decimal(10,0).

Il tipo di dati tinyint non è supportato in Microsoft Fabric.

Convertire i dati integer

Quando i numeri interi vengono convertiti in modo implicito in un tipo di dati carattere, se l'intero è troppo grande per adattarsi al campo carattere, SQL Server usa il carattere ASCII 42, l'asterisco (*).

Le costanti integer maggiori di 2.147.483.647 vengono convertite nel tipo di dati decimale, non nel tipo di dati bigint. Nell'esempio seguente viene illustrata la modifica del tipo di dati del risultato da int a decimale quando il valore soglia viene superato.

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

Il set di risultati è il seguente.

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

Examples

Nell'esempio seguente viene creata una tabella utilizzando i tipi di dati bigint, int, smallint e tinyint. I valori vengono inseriti in ogni colonna e restituiti nell'istruzione 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;

Il set di risultati è il seguente.

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