Share via


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

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-Endpunkt in Microsoft FabricWarehouse in Microsoft Fabric

Exakte Zahlendatentypen für ganzzahlige Daten. Wenn Sie Speicherplatz in der Datenbank sparen möchten, verwenden Sie den kleinsten Datentyp, der auf jeden Fall alle möglichen Werte enthalten kann. Beispielsweise wäre tinyint für das Alter einer Person ausreichend, weil niemand mehr als 255 Jahre alt sein muss. Aber tinyint reicht nicht für das Alter eines Gebäudes aus, da ein Gebäude mehr als 255 Jahre alt sein kann.

Datentyp Range Bereichsausdruck Storage
bigint -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 −2^63 bis 2^63−1 8 Byte
int -2,147,483,648 bis 2,147,483,647 −2^31 bis 2^31−1 4 Byte
smallint –32.768 bis 32.767 −2^15 bis 2^15−1 2 Bytes
tinyint 0 bis 255 2^0−1 bis 2^8−1 1 Byte

Bemerkungen

Der int-Datentyp ist der primäre Integerdatentyp in SQL Server. Der bigint-Datentyp ist für Fälle bestimmt, in denen ganzzahlige Werte den durch den int-Datentyp unterstützten Bereich überschreiten.

bigint passt zwischen smallmoney und int in der Rangfolge der Datentypen.

Die Funktionen geben bigint nur dann zurück, wenn der Parameterausdruck vom Datentyp bigint ist. SQL Server fördert nicht automatisch andere ganzzahlige Datentypen (tinyint, smallint und int) in bigint.

Konvertierung und Parametrisierung

Wenn Sie die +Operatoren ,-, , *, /oder % arithmetische Operatoren verwenden, um implizite oder explizite Konvertierungen von Int-, Smallint-, Tinyint- oder Bigint-Konstantenwerten in den Gleitkomma-, Real-, Dezimal- oder numerischen Datentypen durchzuführen, unterscheiden sich die Regeln, die SQL Server bei der Berechnung des Datentyps und der Genauigkeit der Ausdrucksergebnisse anwendet, je nachdem, ob die Abfrage automatischparameterisiert ist oder nicht.

Aus diesem Grund können ähnliche Ausdrücke in Abfragen unterschiedliche Ergebnisse erzeugen. Wenn eine Abfrage nicht automatischparameterisiert wird, wird der Konstantenwert zuerst in eine Dezimalzahl konvertiert, deren Genauigkeit nur groß genug ist, um den Wert der Konstante zu halten, bevor sie in den angegebenen Datentyp konvertiert wird. Beispielsweise wird der Konstantenwert 1 in decimal(1,0) konvertiert, und der Konstantenwert 250 wird in dezimal(3,0) konvertiert.

Wenn eine Abfrage automatischparameterisiert wird, wird der Konstantenwert immer in dezimal(10,0) konvertiert, bevor er in den endgültigen Datentyp konvertiert wird. Wenn der Operator / verwendet wird, kann bei ähnlichen Abfragen nicht nur die Genauigkeit des Ergebnistyps variieren, sondern auch der Ergebniswert. Der Ergebniswert einer automatischparameterisierten Abfrage, die den Ausdruck SELECT CAST (1.0 / 7 AS float)enthält, unterscheidet sich z. B. vom Ergebniswert derselben Abfrage, die nicht automatischparametert ist, da die Ergebnisse der automatischparameterisierten Abfrage abgeschnitten werden, damit sie in den Datentyp dezimal(10,0) passen.

Der tinyint-Datentyp wird in Microsoft Fabric nicht unterstützt.

Konvertieren ganzzahliger Daten

Wenn ganze Zahlen implizit in einen Zeichendatentyp konvertiert werden, wenn die ganze Zahl zu groß ist, um in das Zeichenfeld einzupassen, verwendet SQL Server ASCII-Zeichen 42, das Sternchen (*).

Integerkonstanten, die größer als 2.147.483.647 sind, werden in den decimal-Datentyp konvertiert und nicht in den bigint-Datentyp. Das folgende Beispiel zeigt, dass bei Überschreitung des Schwellenwerts der Datentyp des Ergebnisses von einem int in einen decimal-Datentyp geändert wird.

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

Hier ist das Resultset.

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

Beispiele

Im folgenden Beispiel wird eine Tabelle mit den Datentypen bigint, int, smallint und tinyint erstellt. Werte werden in jede Spalte eingefügt und in der SELECT-Anweisung zurückgegeben.

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;

Hier ist das Resultset.

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