char en varchar (Transact-SQL)
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL-database in Microsoft Fabric
Tekengegevenstypen die een vaste grootte hebben, tekenof variabele grootte, varchar-. Vanaf SQL Server 2019 (15.x) worden bij het gebruik van een UTF-8-sortering het volledige bereik van Unicode- tekengegevens opgeslagen en worden de UTF-8- tekencodering gebruikt. Als er een niet-UTF-8-sortering is opgegeven, worden in deze gegevenstypen alleen een subset met tekens opgeslagen die worden ondersteund door de bijbehorende codepagina van die sortering.
Argumenten
char [ ( n ) ]
Tekenreeksgegevens met vaste grootte.
n definieert de tekenreeksgrootte in bytes en moet een waarde van 1 tot en met 8.000 zijn. Voor sets met één bytecodering, zoals Latin
, wordt de opslaggrootte n bytes en wordt het aantal tekens dat kan worden opgeslagen ook n. Voor tekensets met meerderebyte-codering is de opslaggrootte nog steeds n bytes, maar het aantal tekens dat kan worden opgeslagen, is mogelijk kleiner dan n. Het ISO-synoniem voor teken is teken. Zie Single-Byte en Multibyte Character Setsvoor meer informatie over tekensets.
varchar [ ( n | max ) ]
Tekenreeksgegevens van variabele grootte. Gebruik n om de tekenreeksgrootte in bytes te definiëren en kan een waarde zijn van 1 tot en met 8.000, of gebruik maximale om een kolombeperkingsgrootte aan te geven tot een maximale opslag van 2^31-1 bytes (2 GB) of 1 MB in Fabric Data Warehouse. Voor sets met één bytecodering, zoals Latin
, wordt de opslaggrootte n bytes + 2 bytes en het aantal tekens dat kan worden opgeslagen, ook n. Voor tekensets met meerderebyte-codering is de opslaggrootte nog steeds n bytes + 2 bytes, maar het aantal tekens dat kan worden opgeslagen, kan kleiner zijn dan n. De ISO-synoniemen voor varchar- zijn tekens die variëren of karakter variëren. Zie Single-Byte en Multibyte Character Setsvoor meer informatie over tekensets.
Opmerkingen
Een veelvoorkomende misvatting is om te denken dat met char(n) en varchar(n), de n het aantal tekens definieert. In char(n) en varchar(n)definieert de n de tekenreekslengte in bytes (0 tot 8.000). n definieert nooit getallen van tekens die kunnen worden opgeslagen. Dit concept is vergelijkbaar met de definitie van nchar en nvarchar.
De misvatting treedt op omdat bij het gebruik van single-byte-codering de opslaggrootte van teken en varchar is n bytes en het aantal tekens ook wordt n. Voor multibyte-codering, zoals UTF-8, leiden hogere Unicode-bereiken (128 tot 1.114.111) echter tot één teken met twee of meer bytes. In een kolom die is gedefinieerd als teken(10), kan de database-engine bijvoorbeeld 10 tekens opslaan die gebruikmaken van encodering met één byte (Unicode-bereik van 0 tot 127), maar minder dan 10 tekens bij het gebruik van multibyte-codering (Unicode-bereik 128 tot 114.111). Zie Storage-verschillen tussen UTF-8 en UTF-16voor meer informatie over Unicode-opslag- en tekenbereiken.
Wanneer n niet is opgegeven in een gegevensdefinitie- of variabeledeclaratie-instructie, is de standaardlengte 1. Als n niet wordt opgegeven bij het gebruik van de functies CAST
en CONVERT
, is de standaardlengte 30.
Objecten die gebruikmaken van teken of varchar- worden de standaardsortering van de database toegewezen, tenzij een specifieke sortering wordt toegewezen met behulp van de COLLATE
-component. De sortering bepaalt de codepagina die wordt gebruikt om de tekengegevens op te slaan.
Multibyte-coderingen in SQL Server zijn onder andere:
Dubbel-bytetekensets (DBCS) voor sommige Oost-Aziatische talen met codepagina's 936 en 950 (Chinees), 932 (Japans) of 949 (Koreaans).
UTF-8 met codepagina 65001.
Van toepassing op: SQL Server 2019 (15.x) en latere versies.
Als u sites hebt die meerdere talen ondersteunen:
- Vanaf SQL Server 2019 (15.x) kunt u overwegen een UTF-8-sortering te gebruiken om Unicode te ondersteunen en problemen met tekenconversie te minimaliseren.
- Als u een eerdere versie van de SQL Server Database Engine gebruikt, kunt u overwegen de Unicode-nchar- of nvarchar gegevenstypen te gebruiken om problemen met tekenconversie te minimaliseren.
Als u teken of varchar-gebruikt, raden we u aan het volgende te doen:
- Gebruik teken wanneer de grootte van de kolomgegevensgegevens consistent is.
- Gebruik varchar wanneer de grootte van de kolomgegevensgegevens aanzienlijk varieert.
- Gebruik varchar(max) wanneer de grootte van de kolomgegevensgegevens aanzienlijk varieert en de tekenreekslengte mogelijk groter is dan 8000 bytes.
Als SET ANSI_PADDING
wordt OFF
wanneer CREATE TABLE
of ALTER TABLE
wordt uitgevoerd, wordt een kolom die als NULL
is gedefinieerd, verwerkt als varchar.
Waarschuwing
Elke niet-null-varchar(max) of nvarchar(max) kolom vereist 24 bytes extra vaste toewijzing, die telt ten opzichte van de limiet van 8060 byterijen tijdens een sorteerbewerking. Hiermee kunt u een impliciete limiet maken voor het aantal niet-null-varchar(max) of nvarchar(max) kolommen die in een tabel kunnen worden gemaakt.
Er wordt geen speciale fout weergegeven wanneer de tabel wordt gemaakt (behalve de gebruikelijke waarschuwing dat de maximale rijgrootte het toegestane maximum van 8.060 bytes overschrijdt) of op het moment van het invoegen van gegevens. Deze grote rijgrootte kan fouten veroorzaken (zoals fout 512) tijdens sommige normale bewerkingen, zoals een update van een geclusterde indexsleutel of sortering van de volledige kolomset, die alleen optreedt tijdens het uitvoeren van een bewerking.
Tekengegevens converteren
Wanneer tekenexpressies worden geconverteerd naar een gegevenstype van een ander teken, worden waarden die te lang zijn voor het nieuwe gegevenstype afgekapt. De uniqueidentifier type wordt beschouwd als een tekentype voor conversie van een tekenexpressie, en is dus onderhevig aan de afkappingsregels voor het converteren naar een tekentype. Zie de sectie Voorbeelden.
Wanneer een tekenexpressie wordt geconverteerd naar een tekenexpressie van een ander gegevenstype of een andere grootte, zoals van teken(5) naar varchar(5)of char(20) naar teken(15), wordt de sortering van de invoerwaarde toegewezen aan de geconverteerde waarde. Als een niet-tekenexpressie wordt geconverteerd naar een gegevenstype teken, wordt de standaardsortering van de huidige database toegewezen aan de geconverteerde waarde. In beide gevallen kunt u een specifieke sortering toewijzen met behulp van de component COLLATE.
Notitie
Vertalingen van codepagina's worden ondersteund voor teken en varchar gegevenstypen, maar niet voor het gegevenstype tekst. Net als bij eerdere versies van SQL Server worden gegevensverlies tijdens vertalingen van codepagina's niet gerapporteerd.
Tekenexpressies die worden geconverteerd naar een geschatte numerieke gegevenstype kunnen optionele exponentiële notatie bevatten. Deze notatie is een kleine letter e
of hoofdletters E
gevolgd door een optioneel plusteken (+
) of minteken (-
) en vervolgens een getal.
Tekenexpressies die worden geconverteerd naar een exacte numerieke gegevenstype moeten bestaan uit cijfers, een decimaalteken en een optioneel plusteken (+
) of minteken (-
). Voorloopspaties worden genegeerd. Scheidingstekens voor komma's, zoals het scheidingsteken voor duizendtallen in 123,456.00
, zijn niet toegestaan in de tekenreeks.
Tekenexpressies die worden geconverteerd naar geld of smallmoney gegevenstypen kunnen ook een optioneel decimaalteken en dollarteken ($
) bevatten. Kommascheidingstekens, zoals in $123,456.00
, zijn toegestaan.
Wanneer een lege tekenreeks wordt geconverteerd naar een int, wordt de waarde 0
. Wanneer een lege tekenreeks wordt geconverteerd naar een datum, wordt de waarde ervan de datum , die 1900-01-01
is.
Voorbeelden
Eén. De standaardwaarde van n weergeven wanneer deze wordt gebruikt in de declaratie van variabelen
In het volgende voorbeeld ziet u de standaardwaarde van n is 1 voor het teken en varchar gegevenstypen, wanneer deze worden gebruikt in de variabeledeclaratie.
DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';
--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO
B. De standaardwaarde van n weergeven wanneer varchar wordt gebruikt met CAST en CONVERTEREN
In het volgende voorbeeld ziet u dat de standaardwaarde van n 30 is wanneer het teken of varchar- gegevenstypen worden gebruikt met de functies CAST
en CONVERT
.
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. Gegevens converteren voor weergavedoeleinden
In het volgende voorbeeld worden twee kolommen geconverteerd naar tekentypen en wordt een stijl toegepast waarmee een specifieke indeling wordt toegepast op de weergegeven gegevens. Een geld type wordt geconverteerd naar tekengegevens en stijl 1
wordt toegepast, waarin de waarden met komma's om de drie cijfers links van het decimaalteken worden weergegeven en twee cijfers rechts van het decimaalteken. Een datum/tijd type wordt geconverteerd naar tekengegevens en stijl 3
wordt toegepast, waarin de gegevens in de notatie dd/mm/yy
worden weergegeven. In de WHERE
component wordt een geld type omgezet in een tekentype om een tekenreeksvergelijkingsbewerking uit te voeren.
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 is het resultatenoverzicht.
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. UniqueIdentifier-gegevens converteren
In het volgende voorbeeld wordt een uniqueidentifier- waarde geconverteerd naar een teken gegevenstype.
DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';
In het volgende voorbeeld ziet u hoe de gegevens worden afgekapt wanneer de waarde te lang is voor het gegevenstype dat wordt geconverteerd. Omdat het type uniqueidentifier beperkt is tot 36 tekens, worden de tekens die langer zijn dan die lengte afgekapt.
DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;
Hier is het resultatenoverzicht.
String TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong 0E984725-C51C-4BF4-9960-E1C80E27ABA0