Articles

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

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

Applies to: sìSQL Server (tutte le versioni supportate) SìAzure SQL Database SìAzure SQL Istanza Gestita sìAzure Sinapsi Analytics sìParallel Data Warehouse

Esatto numero di tipi di dati che uso di dati integer. Per risparmiare spazio nel database, utilizzare 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 vive per avere più di 255 anni. Ma tinyint non sarebbe sufficiente per l’età di un edificio perché un edificio può avere più di 255 anni.

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

Note

Il tipo di dati int è il tipo di dati intero primario in SQL Server. Il tipo di dati bigint è destinato all’uso quando i valori interi potrebbero superare l’intervallo supportato dal tipo di dati int.

bigint si inserisce tra smallmoney e int nel grafico di precedenza del tipo di dati.le funzioni

restituiscono bigint solo se l’espressione del parametro è un tipo di dati bigint. SQL Server non promuove automaticamente altri tipi di dati interi (tinyint, smallint e int) a bigint.

Attenzione

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

Pertanto, espressioni simili nelle query possono talvolta produrre risultati diversi. Quando una query non è autoparametrizzata, il valore costante viene prima convertito in numerico, la cui precisione è abbastanza grande da contenere il valore della costante, prima di convertirlo nel tipo di dati specificato. Ad esempio, il valore costante 1 viene convertito in numerico (1, 0) e il valore costante 250 viene convertito in numerico (3, 0).

Quando una query viene autoparametrizzata, il valore costante viene sempre convertito in numerico (10, 0) prima di convertirlo nel tipo di dati finale. Quando l’operatore / è coinvolto, non solo la precisione del tipo di risultato può differire tra query simili, ma anche il valore del risultato può differire. Ad esempio, il valore del risultato di una query autoparameterizzata che include l’espressione SELECT CAST (1.0 / 7 AS float), differisce dal valore del risultato della stessa query che non è autoparameterizzata, poiché i risultati della query autoparameterizzata vengono troncati per adattarsi al tipo di dati numerico (10, 0).

Conversione dei dati interi

Quando gli interi vengono convertiti implicitamente in un tipo di dati di carattere, se l’intero è troppo grande per essere inserito nel campo carattere, SQL Server inserisce il carattere ASCII 42, l’asterisco (*).

Le costanti intere maggiori di 2.147.483.647 vengono convertite nel tipo di dati decimale, non nel tipo di dati bigint. L’esempio seguente mostra che quando viene superato il valore di soglia, il tipo di dati del risultato cambia da un int a un decimale.

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

Ecco il set di risultati.

Result1 Result2 1073741823 1073741824.500000 

Esempi

Il seguente esempio crea 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; 

Ecco 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.tipi (Transact-SQL)