char und varchar (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL-Analyseendpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric
Dieser Artikel beschreibt Zeichendatentypen, die entweder über eine feste Größe – char – oder über eine variable Größe – varchar – verfügen. Ab SQL Server 2019 (15.x) speichern diese Datentypen den vollständigen Bereich von Unicode-Zeichendaten und verwenden die UTF-8-Zeichencodierung . Wenn eine Sortierung ohne aktivierte UTF-8 angegeben wird, speichern diese Datentypen nur eine Teilmenge von Zeichen, die von der entsprechenden Codepage dieser Sortierung unterstützt wird.
Argumente
char [ ( n ) ]
Zeichenfolgendaten mit fester Größe. n definiert die Größe der Zeichenfolge in Byte und muss ein Wert zwischen 1 und 8.000 sein. Für Einzelbyte-Codierungszeichensätze wie Latin
beträgt die Speichergröße n Byte, und die Anzahl von Zeichen, die gespeichert werden können, ist ebenfalls n. Bei Multibyte-Codierungszeichensätzen beträgt die Speichergröße immer noch n Byte, aber die Anzahl der Zeichen, die gespeichert werden können, kann kleiner als n sein. Das ISO-Synonym für char lautet character. Weitere Informationen zu Zeichensätzen finden Sie unter Einzelbyte- und Mehrbyte-Zeichensätze.
varchar [( n | max )]
Zeichenfolgendaten mit variabler Größe. Verwenden Sie n, um die Größe der Zeichenfolge in Byte zu definieren. Der Wert muss zwischen 1 und 8.000 liegen. Alternativ können Sie max verwenden, um eine Beschränkung der Spaltengröße bis zu einem maximalen Speicher von 2^31-1 Byte (2 GB) anzugeben. Für Einzelbyte-Codierungszeichensätze wie Latin
beträgt die Speichergröße n Byte + 2 Byte, und die Anzahl von Zeichen, die gespeichert werden können, ist ebenfalls n. Bei Multibyte-Codierungszeichensätzen beträgt die Speichergröße immer noch n Byte + 2 Byte, aber die Anzahl der Zeichen, die gespeichert werden können, kann kleiner als n sein. Die ISO-Synonyme für varchar lauten char varying oder character varying. Weitere Informationen zu Zeichensätzen finden Sie unter Einzelbyte- und Mehrbyte-Zeichensätze.
Bemerkungen
Ein gängiges Missverständnis besteht darin, dass in char(n) und varchar(n) das n die Anzahl von Zeichen definiert. In char(n) und varchar(n) definiert das n jedoch die Zeichenfolgenlänge in Byte (0 bis 8.000). n definiert niemals die Anzahl von Zeichen, die gespeichert werden können. Dieses Konzept ähnelt der Definition von nchar und nvarchar.
Das Missverständnis tritt auf, da die Speichergröße von char und varchar bei der Verwendung einer Einzelbytecodierung n Byte und die Anzahl von Zeichen ebenfalls n ist. Bei der Multibytecodierung wie UTF-8 führen höhere Unicode-Bereiche (128 bis 1.114.111) jedoch dazu, dass ein Zeichen zwei oder mehr Byte verwendet. In einer als char(10) definierten Spalte kann die Datenbank-Engine beispielsweise 10 Zeichen speichern, die die Einzelbytecodierung (Unicode-Bereich 0 bis 127) verwenden, jedoch weniger als 10 Zeichen bei Verwendung der Multibytecodierung (Unicode-Bereich 128 bis 1.114.111). Weitere Informationen zum Unicode-Speicher und -Zeichenbereichen finden Sie unter Speicherunterschiede zwischen UTF-8 und UTF-16.
Wenn n in einer Datendefinitions- oder Variablendeklarationsanweisung nicht angegeben ist, beträgt die Standardlänge 1. Wenn n bei Verwendung der CAST
- und CONVERT
-Funktionen nicht angegeben ist, beträgt die Standardlänge 30.
Objekten, die char oder varchar verwenden, wird die Standardsortierung der Datenbank zugewiesen, es sei denn, mithilfe der COLLATE
-Klausel wird eine bestimmte Sortierung zugewiesen. Die Sortierung bestimmt die Codepage, die zum Speichern der Zeichendaten verwendet wird.
Zu den Multibyte-Codierungen in SQL Server zählen:
Doppelbyte-Zeichensätze (DBCS) für einige ostasiatische Sprachen mit Codepages 936 und 950 (Chinesisch), 932 (Japanisch) oder 949 (Koreanisch).
UTF-8 mit Codepage 65001.
Gilt für: SQL Server 2019 (15.x) und höhere Versionen.
Wenn Sie Websites haben, die mehrere Sprachen unterstützen:
- Ab SQL Server 2019 (15.x) wird eine Sortierung mit aktiviertem UTF-8 empfohlen, um Unicode zu unterstützen und Probleme bei der Zeichenkonvertierung zu vermeiden.
- Wenn Sie eine vorherige Version der SQL Server-Datenbank-Engine verwenden, sollten Sie die Unicodedatentypen nchar oder nvarchar verwenden, um Probleme bei der Zeichenkonvertierung zu vermeiden.
Wenn Sie char oder varchar verwenden, wird Folgendes empfohlen:
- Verwenden Sie char, wenn die Dateneinträge einer Spalte jeweils gleich lang sind.
- Verwenden Sie varchar, wenn sich die Dateneinträge einer Spalte in ihrer Größe erheblich unterscheiden.
- Verwenden Sie varchar(max) , wenn die Dateneinträge einer Spalte unterschiedlich lang sind, und die Zeichenfolgenlänge 8.000 Byte überschreitet.
Wenn SET ANSI_PADDING
eine OFF
oder ALTER TABLE
mehrere CREATE TABLE
Zeichen ausgeführt werden, wird eine Zeichenspalte, die als NULL
varchar behandelt wird, definiert.
Warnung
Jede varchar(max)- oder nvarchar(max)-Spalte, die ungleich NULL ist, erfordert 24 Byte an zusätzlicher fester Zuteilung, die während eines Sortiervorgangs hinsichtlich des Zeilenlimits von 8.060 Byte gelten. Dies kann zur Erstellung einer impliziten Beschränkung der Anzahl der varchar(max)- oder nvarchar(max)-Spalten führen, die ungleich NULL sind und in einer Tabelle erstellt werden können.
Beim Erstellen der Tabelle (außerhalb der üblichen Warnung darüber, dass die maximale Zeilengröße das zulässige Maximum von 8.060 Byte überschreitet) oder beim Einfügen der Daten wird kein spezieller Fehler ausgegeben. Diese große Zeilengröße kann während einiger normaler Vorgänge Fehler verursachen (z. B. Fehler 512). Dazu gehören z. B. die Aktualisierung eines gruppierten Indexschlüssels oder das Sortieren des vollständigen Spaltensatzes. Diese Fehler können nur beim Ausführen eines Vorgangs auftreten.
Konvertieren von Zeichendaten
Werden Zeichenausdrücke in einen Zeichendatentyp mit einer anderen Größe konvertiert, dann werden Werte, die für den neuen Datentyp zu lang sind, abgeschnitten. Der uniqueidentifier-Typ wird bei der Konvertierung von Zeichenausdrücken als Zeichentyp behandelt und unterliegt daher den Kürzungsregeln für die Konvertierung in einen Zeichentyp. Siehe den Abschnitt Beispiele.
Wenn ein Zeichenausdruck in einen Zeichenausdruck eines anderen Datentyps oder einer anderen Größe konvertiert wird (z.B. char(5) in varchar(5) oder char(20) in char(15) ), wird die Sortierung des Eingabewerts dem konvertierten Wert zugewiesen. Wird ein Nichtzeichenausdruck zu einem Zeichendatentyp konvertiert, wird die Standardsortierung der aktuellen Datenbank dem konvertierten Wert zugewiesen. In beiden Fällen können Sie mithilfe der COLLATE-Klausel auch eine bestimmte Sortierung zuweisen.
Hinweis
Codepageübersetzungen werden für die Datentypen char und varchar, nicht jedoch für den Datentyp text unterstützt. Wie auch bei früheren Versionen von SQL Server wird der Datenverlust während der Codepageübersetzung nicht gemeldet.
Zeichenausdrücke, die in einen ungefähren numerischen Datentyp konvertiert werden, können die optionale Exponentialschreibweise enthalten. Diese Schreibweise beginnt mit dem Kleinbuchstaben e
oder dem Großbuchstaben E
, auf den ein optionales Plus- (+
) oder Minuszeichen (-
) und dann eine Zahl folgen.
Zeichenausdrücke, die in einen exakten numerischen Datentyp konvertiert werden, müssen aus Ziffern, einem Dezimaltrennzeichen und einem optionalen Plus- (+
) oder Minuszeichen (-
) zusammengesetzt sein. Führende Leerzeichen werden ignoriert. Kommas als Trennzeichen (z. B. als Tausendertrennzeichen in 123,456.00
) sind in der Zeichenfolge nicht zulässig.
Zeichenausdrücke, die in die Datentypen money oder smallmoney konvertiert werden, können außerdem ein optionales Dezimaltrennzeichen und ein Dollarzeichen ($
) enthalten. Kommas als Trennzeichen (wie in $123,456.00
) sind zulässig.
Wenn eine leere Zeichenfolge in einen int-Wert konvertiert wird, lautet der Wert 0
. Wenn eine leere Zeichenfolge in ein Datum konvertiert wird, wird der Wert zum Datum - das heißt 1900-01-01
.
Beispiele
A. Anzeigen des Standardwerts von n bei Verwendung in einer Variablendeklaration
Das folgende Beispiel zeigt den Standardwert n ist 1 für die Datentypen Char und Varchar , wenn sie in der Variablendeklaration verwendet werden.
DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO
B. Anzeigen des Standardwerts von n bei Verwendung von varchar mit CAST und CONVERT
Das folgende Beispiel zeigt, dass 30 der Standardwert von n ist, wenn der Datentyp char oder varchar in den Funktionen CAST
und CONVERT
verwendet wird.
DECLARE @myVariable AS VARCHAR(40);
SET @myVariable = 'This string is longer than thirty characters';
SELECT CAST(@myVariable AS VARCHAR);
SELECT DATALENGTH(CAST(@myVariable AS VARCHAR)) AS 'VarcharDefaultLength';
SELECT CONVERT(CHAR, @myVariable);
SELECT DATALENGTH(CONVERT(CHAR, @myVariable)) AS 'VarcharDefaultLength';
C. Konvertieren von Daten zu Anzeigezwecken
Im folgenden Beispiel werden zwei Spalten in Zeichentypen konvertiert und ein bestimmtes Format auf die angezeigten Daten angewendet. Ein money-Typ wird in Zeichendaten konvertiert, und der Stil 1
wird angewendet. Bei diesem werden für die Werte zwei Ziffern rechts vom Dezimaltrennzeichen und links vom Dezimaltrennzeichen nach jeder dritten Ziffer ein Trennzeichen angezeigt. Ein datetime-Typ wird in Zeichendaten konvertiert, und der Stil 3
wird angewendet, durch das die Daten im Format dd/mm/yy
anzeigt werden. In der WHERE
-Klausel wird ein money-Typ in einen Zeichentyp umgewandelt, um einen Vergleichsvorgang für die Zeichenfolgen ausführen zu können.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
SalesYTD,
CONVERT(VARCHAR(12), SalesYTD, 1) AS MoneyDisplayStyle1,
GETDATE() AS CurrentDate,
CONVERT(VARCHAR(12), GETDATE(), 3) AS DateDisplayStyle3
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS VARCHAR(20)) LIKE '1%';
Hier sehen Sie das Ergebnis.
BusinessEntityID SalesYTD DisplayFormat CurrentDate DisplayDateFormat
---------------- --------------------- ------------- ----------------------- -----------------
278 1453719.4653 1,453,719.47 2011-05-07 14:29:01.193 07/05/11
280 1352577.1325 1,352,577.13 2011-05-07 14:29:01.193 07/05/11
283 1573012.9383 1,573,012.94 2011-05-07 14:29:01.193 07/05/11
284 1576562.1966 1,576,562.20 2011-05-07 14:29:01.193 07/05/11
285 172524.4512 172,524.45 2011-05-07 14:29:01.193 07/05/11
286 1421810.9242 1,421,810.92 2011-05-07 14:29:01.193 07/05/11
288 1827066.7118 1,827,066.71 2011-05-07 14:29:01.193 07/05/11
D: Konvertieren von Eindeutigidentifiziererdaten
Im folgenden Beispiel wird ein uniqueidentifier-Wert in einen char-Datentyp konvertiert.
DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';
Im folgenden Beispiel wird das Abschneiden von Daten veranschaulicht, wenn der Wert zu lang für den Datentyp ist, in den er konvertiert wird. Da der uniqueidentifier -Typ auf 36 Zeichen beschränkt ist, werden die Zeichen, die diese Länge überschreiten, abgeschnitten.
DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;
Hier sehen Sie das Ergebnis.
String TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0