Udostępnij za pomocą


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

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Dokładne typy danych liczb, które używają danych całkowitych. Aby zaoszczędzić miejsce w bazie danych, użyj najmniejszego typu danych, który może niezawodnie zawierać wszystkie możliwe wartości. Na przykład tinyint byłoby wystarczające dla małej tabeli odnośników z wartościami stanu, ponieważ może przechowywać aż 256 wierszy. Ale tinyint nie jest wystarczająca dla listy pracowników, ponieważ twoja firma może mieć setki lub tysiące pracowników.

Typ danych Range Wyrażenie zakresu Magazyn
bigint -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 -2^63 do 2^63-1 8 bajtów
int -2,147,483,648 do 2,147,483,647 -2^31 do 2^31-1 4 bajty
smallint -32,768 do 32,767 -2^15 do 2^15-1 2 bajty
tinyint Od 0 do 255 Od 2^0 do 2^8-1 1 bajt

Remarks

Typ danych int jest podstawowym typem danych całkowitych w programie SQL Server. Typ danych bigint jest przeznaczony do użycia, gdy wartości całkowite mogą przekraczać zakres obsługiwany przez typ danych int .

bigint pasuje między małą iintą na wykresie pierwszeństwa typu danych.

Funkcje zwracają bigint tylko wtedy, gdy wyrażenie parametru jest typem danych bigint . Program SQL Server nie promuje automatycznie innych typów danych całkowitych (tinyint, smallint i int) na bigint.

Konwersja i parametryzacja

W przypadku używania +operatorów arytmetycznych , -*/%, lub arytmetycznych do wykonywania niejawnej lub jawnej konwersji int, smallint, tinyint lub bigint wartości stałych na typy danych zmiennoprzecinkowych, rzeczywistych, dziesiętnych lub liczbowych, reguły stosowane przez program SQL Server podczas obliczania typu danych i precyzji wyników wyrażenia różnią się w zależności od tego, czy zapytanie jest autoparametryczne, czy nie.

W związku z tym podobne wyrażenia w zapytaniach mogą czasami generować różne wyniki. Gdy zapytanie nie jest autoparametryczne, stała wartość jest najpierw konwertowana na liczbę dziesiętną, której precyzja jest wystarczająco duża, aby przechowywać wartość stałej przed przekonwertowaniem na określony typ danych. Na przykład wartość 1 stała jest konwertowana na wartość dziesiętną (1,0), a stała jest 250 konwertowana na wartość dziesiętną(3,0).

Gdy zapytanie jest autoparametryczne, wartość stała jest zawsze konwertowana na wartość dziesiętną (10 0) przed przekonwertowaniem na ostateczny typ danych. Jeśli operator /jest zaangażowany, nie tylko precyzja typu wyniku różni się między podobnymi zapytaniami, ale również wartość wyniku może się różnić. Na przykład wartość wyniku autoparametryzowanego zapytania, która zawiera wyrażenie SELECT CAST (1.0 / 7 AS float), różni się od wartości wyniku tego samego zapytania, które nie jest autoparametryczne, ponieważ wyniki zapytania autoparametrizowanego są obcinane tak, aby mieściły się w typie danych dziesiętnych (10 0).

Typ danych tinyint nie jest obsługiwany w usłudze Microsoft Fabric.

Konwertowanie danych całkowitych

Jeśli liczby całkowite są niejawnie konwertowane na typ danych znaków, jeśli liczba całkowita jest zbyt duża, aby zmieścić się w polu znaku, program SQL Server używa znaku ASCII 42, gwiazdki (*).

Stałe całkowite większe niż 2147 483 647 są konwertowane na typ danych dziesiętnych , a nie typ danych bigint . W poniższym przykładzie pokazano, że po przekroczeniu wartości progowej typ danych wyniku zmienia się z int na dziesiętny.

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

Oto zestaw wyników.

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

Examples

Poniższy przykład tworzy tabelę przy użyciu typów danych bigint, int, smallint i tinyint . Wartości są wstawiane do każdej kolumny i zwracane w instrukcji 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;

Oto zestaw wyników.

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