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

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse 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 l'età di una persona perché nessuno raggiunge un'età maggiore di 255 anni. Ma tinyint non sarebbe sufficiente per la durata di un edificio perché un edificio può avere più di 255 anni.

Tipo di dati Intervallo 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

Osservazioni:

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) in bigint.

Attenzione

Quando si usano gli operatori aritmetici +, -, *, / o % per eseguire conversioni implicite o esplicite di costanti di tipo int, smallint, tinyint o bigint per tipi di dati mobili, reali, decimali o numerici, le regole applicate da SQL Server per calcolare il tipo di dati e la precisione dei risultati delle espressioni variano a seconda del fatto che per la query sia attivata o meno la parametrizzazione automatica.

Per questo motivo, in alcuni casi espressioni simili nelle query possono dare risultati diversi. Se per una query non è attivata la parametrizzazione automatica, il valore costante viene prima convertito nel tipo numerico, la cui precisione è sufficiente a contenere il valore della costante, quindi viene convertito nel tipo di dati specificato. Il valore costante 1, ad esempio, viene convertito in numerico (1, 0) e il valore costante 250 viene convertito in numerico (3, 0).

Se per una query è attivata la parametrizzazione automatica, il valore costante viene sempre convertito in numerico (10, 0) prima di essere convertito 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 parametrizzazione automatica che include l'espressione SELECT CAST (1.0 / 7 AS float) è diverso dal valore del risultato della stessa query ma senza parametrizzazione automatica, perché i risultati della query con parametrizzazione automatica vengono troncati per rientrare nel tipo di dati numerico (10, 0).

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

Conversione di dati di tipo integer

Quando i numeri interi vengono convertiti implicitamente in un tipo di dati carattere, se il numero intero è troppo grande per adattarsi al campo del carattere, SQL Server immette 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 ;  

Questo è il set di risultati.

Result1      Result2  
1073741823   1073741824.500000  

Esempi

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;  

Questo è il set di risultati.

MyBigIntColumn       MyIntColumn MySmallIntColumn MyTinyIntColumn  
-------------------- ----------- ---------------- ---------------  
9223372036854775807  2147483647  32767            255  
  
(1 row(s) affected)  

Vedi anche

ALTER TABLE (Transact-SQL)
CAST e CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)