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

Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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. tinyint wäre z.B. ausreichend für das Alter einer Person, da niemand älter als 255 Jahre wird. tinyint wäre allerdings für das Alter eines Gebäudes nicht ausreichend, da ein Gebäude länger als 255 Jahren stehen bleiben kann.

Datentyp Range Storage
bigint -2^63 (-9.223.372.036.854.775.808) bis 2^63-1 (9.223.372.036.854.775.807) 8 Byte
int -2^31 (-2.147.483.648) bis 2^31-1 (2.147.483.647) 4 Byte
smallint -2^15 (-32,768) bis 2^15-1 (32,767) 2 Byte
tinyint 0 bis 255 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 stuft andere Integerdatentypen (tinyint, smallint und int) nicht automatisch auf bigint herauf.

Achtung

Wenn Sie die arithmetischen Operatoren +, -, *, / oder % verwenden, um eine implizite oder explizite Konvertierung der konstanten Werte int, smallint, tinyint oder bigint in die Datentypen float, real, decimal oder numeric auszuführen, wendet SQL Server beim Berechnen des Datentyps und der Genauigkeit der Ausdrucksergebnisse unterschiedliche Regeln an, je nachdem, ob die Abfrage automatisch parametrisiert wurde oder nicht.

Aus diesem Grund können ähnliche Ausdrücke in Abfragen unterschiedliche Ergebnisse erzeugen. Wenn eine Abfrage nicht automatisch parametrisiert wird, wird der konstante Wert vor dem Konvertieren in den angegebenen Datentyp zunächst in den numeric-Datentyp konvertiert, dessen Genauigkeit für den Wert der Konstanten genau ausreicht. Der konstante Wert 1 wird beispielsweise in numeric (1, 0) und der konstante Wert 250 in numeric (3, 0) konvertiert.

Wenn eine Abfrage automatisch parametrisiert wird, wird der konstante Wert vor dem Konvertieren in den endgültigen Datentyp immer in numeric (10, 0) konvertiert. Wenn der Operator / verwendet wird, kann bei ähnlichen Abfragen nicht nur die Genauigkeit des Ergebnistyps variieren, sondern auch der Ergebniswert. Der Ergebniswert einer automatisch parametrisierten Abfrage, die den Ausdruck SELECT CAST (1.0 / 7 AS float) einschließt, weicht beispielsweise vom Ergebniswert derselben Abfrage ab (die nicht automatisch parametrisiert wurde), da die Ergebnisse der automatisch parametrisierten Abfrage abgeschnitten werden, d.h., sie werden an die Länge des numeric (10, 0) -Datentyps angepasst.

Konvertieren von Integerdaten

Wenn ganze Zahlen implizit in einen Zeichendatentyp konvertiert werden und die ganze Zahl für das Zeichenfeld zu groß ist, fügt SQL Server das ASCII-Zeichen 42 (Sternchen (*)) ein.

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  
  
(1 row(s) affected)  

Weitere Informationen

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