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 (todas las versiones compatibles) SíAzure SQL Database SíInstancia administrada de Azure SQL síAzure Synapse Analytics síAlmacén de datos en paralelo

Tipos de datos de números exactos que utilizan datos enteros. Para ahorrar espacio en la base de datos, utilice el tipo de datos más pequeño que pueda contener de forma fiable todos los valores posibles. Por ejemplo, el tinyint sería suficiente para la edad de una persona porque nadie vive para tener más de 255 años. Pero el tinyint no sería suficiente para la edad de un edificio porque un edificio puede tener más de 255 años.

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

Observaciones

El tipo de datos int es el tipo de datos entero principal en SQL Server. El tipo de datos bigint está diseñado para usarse cuando los valores enteros pueden exceder el rango que admite el tipo de datos int.

bigint se ajusta entre smallmoney e int en el gráfico de precedencia de tipo de datos.Las funciones

devuelven bigint solo si la expresión del parámetro es un tipo de datos bigint. SQL Server no promueve automáticamente otros tipos de datos enteros (tinyint, smallint e int) a bigint.

Precaución

Cuando se utilizan los operadores aritméticos+, -,*, / o % para realizar conversiones implícitas o explícitas de valores constantes int, smallint, tinyint o bigint a los tipos de datos flotantes, reales, decimales o numéricos, las reglas que aplica SQL Server cuando calcula el tipo de datos y la precisión de los resultados de la expresión difieren dependiendo de si la consulta está autoparameterizada o no.

Por lo tanto, expresiones similares en consultas a veces pueden producir resultados diferentes. Cuando una consulta no se parametriza automáticamente, el valor de la constante se convierte primero en numérico, cuya precisión es lo suficientemente grande como para contener el valor de la constante, antes de convertir al tipo de datos especificado. Por ejemplo, el valor constante 1 se convierte en numérico (1, 0) y el valor constante 250 se convierte en numérico (3, 0).

Cuando una consulta se parametriza automáticamente, el valor constante siempre se convierte en numérico (10, 0) antes de convertir al tipo de datos final. Cuando el operador / está involucrado, no solo la precisión del tipo de resultado puede diferir entre consultas similares, sino que el valor del resultado también puede diferir. Por ejemplo, el valor de resultado de una consulta autoparameterizada que incluye la expresión SELECT CAST (1.0 / 7 AS float), difiere del valor de resultado de la misma consulta que no está autoparameterizada, porque los resultados de la consulta autoparameterizada se truncan para ajustarse al tipo de datos numérico (10, 0).

Conversión de datos enteros

Cuando los enteros se convierten implícitamente a un tipo de datos de carácter, si el entero es demasiado grande para caber en el campo de caracteres, SQL Server introduce el carácter ASCII 42, el asterisco (*).

Las constantes enteras mayores que 2.147.483.647 se convierten al tipo de datos decimal, no al tipo de datos bigint. El siguiente ejemplo muestra que cuando se supera el valor de umbral, el tipo de datos del resultado cambia de int a decimal.

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

Aquí está el conjunto de resultados.

Result1 Result2 1073741823 1073741824.500000 

Ejemplos

El siguiente ejemplo crea una tabla utilizando los tipos de datos bigint, int, smallint y tinyint. Los valores se insertan en cada columna y se devuelven en la instrucción 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; 

Aquí está el conjunto de resultados.

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

Véase también

ALTER TABLE (Transact-SQL)
CAST y CONVERT (Transact-SQL)
CREAR TABLA (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.tipos (Transact-SQL)