Dela via


char och varchar (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Teckendatatyper som antingen har fast storlek, teckeneller variabel storlek varchar. Från och med SQL Server 2019 (15.x), när en UTF-8-aktiverad sortering används, lagrar dessa datatyper hela intervallet av Unicode- teckendata och använder UTF-8 teckenkodning. Om en icke-UTF-8-sortering anges lagrar dessa datatyper endast en delmängd tecken som stöds av motsvarande kodsida i sorteringen.

Argumenten

char [ ( n ) ]

Strängdata med fast storlek. n definierar strängstorleken i byte och måste vara ett värde från 1 till 8 000. För teckenuppsättningar med en byteskodning, till exempel Latin, är lagringsstorleken n byte och antalet tecken som kan lagras är också n. För teckenuppsättningar med flerabyte är lagringsstorleken fortfarande n byte, men antalet tecken som kan lagras kan vara mindre än n. ISO-synonymen för tecken är tecken. Mer information om teckenuppsättningar finns i Single-Byte och Flerbyte-teckenuppsättningar.

varchar [ ( n | max ) ]

Strängdata med variabel storlek. Använd n för att definiera strängstorleken i byte och kan vara ett värde från 1 till 8 000, eller använd max för att ange en kolumnbegränsningsstorlek upp till en maximal lagring på 2^31–1 byte (2 GB) eller 1 MB i Infrastrukturdatalager. För teckenuppsättningar med en byteskodning, till exempel Latin, är lagringsstorleken n byte + 2 byte och antalet tecken som kan lagras är också n. För teckenuppsättningar med flerabyte är lagringsstorleken fortfarande n byte + 2 byte, men antalet tecken som kan lagras kan vara mindre än n. ISO-synonymerna för varchar är tecken som varierar eller tecken som varierar. Mer information om teckenuppsättningar finns i Single-Byte och Flerbyte-teckenuppsättningar.

Anmärkningar

En vanlig missuppfattning är att tro att med char(n) och varchar(n)definierar n antalet tecken. Men i char(n) och varchar(n)definierar n stränglängden i byte (0 till 8 000). n definierar aldrig antal tecken som kan lagras. Det här konceptet liknar definitionen av nchar och nvarchar.

Missuppfattningen inträffar eftersom lagringsstorleken för tecken och varchar n byte och antalet tecken också är n. För flerbyteskodning, till exempel UTF-8, resulterar dock högre Unicode-intervall (128 till 1 114 111) i ett tecken med två eller flera byte. I en kolumn som definierats som tecken(10)kan databasmotorn till exempel lagra 10 tecken som använder enkel bytekodning (Unicode-intervall 0 till 127), men färre än 10 tecken när du använder kodning i flerabyte (Unicode-intervall 128 till 1 114 111). Mer information om Unicode-lagrings- och teckenintervall finns i Lagringsskillnader mellan UTF-8 och UTF-16.

När n inte anges i en datadefinition eller variabeldeklaration är standardlängden 1. Om n inte anges när du använder funktionerna CAST och CONVERT är standardlängden 30.

Objekt som använder tecken eller varchar tilldelas standardsortering av databasen, såvida inte en specifik sortering tilldelas med hjälp av COLLATE-satsen. Sorteringen styr den kodsida som används för att lagra teckendata.

Flerbyteskodningar i SQL Server omfattar:

  • Teckenuppsättningar med dubbla byte (DBCS) för vissa östasiatiska språk med kodsidorna 936 och 950 (kinesiska), 932 (japanska) eller 949 (koreanska).

  • UTF-8 med kodsida 65001.

    gäller för: SQL Server 2019 (15.x) och senare versioner.

Om du har webbplatser som stöder flera språk:

  • Från och med SQL Server 2019 (15.x) bör du överväga att använda en UTF-8-aktiverad sortering för att stödja Unicode och minimera problem med teckenkonvertering.
  • Om du använder en tidigare version av SQL Server Database Engine bör du överväga att använda Unicode nchar eller nvarchar datatyper för att minimera problem med teckenkonvertering.

Om du använder tecken eller varcharrekommenderar vi att du:

  • Använd tecken när kolumndataposternas storlekar är konsekventa.
  • Använd varchar när storleken på kolumndataposterna varierar avsevärt.
  • Använd varchar(max) när storleken på kolumndataposterna varierar avsevärt och stränglängden kan överstiga 8 000 byte.

Om SET ANSI_PADDINGOFF när antingen CREATE TABLE eller ALTER TABLE körs, hanteras en teckenkolumn som definieras som NULL som varchar.

Varning

Varje icke-null-varchar(max) eller nvarchar(max) kolumn kräver 24 byte ytterligare fast allokering, vilket räknas mot radgränsen på 8 060 byte under en sorteringsåtgärd. Detta kan skapa en implicit gräns för antalet icke-null-varchar(max) eller nvarchar(max) kolumner som kan skapas i en tabell.

Inget särskilt fel anges när tabellen skapas (utöver den vanliga varningen att den maximala radstorleken överskrider det tillåtna maximala antalet 8 060 byte) eller vid tidpunkten för datainfogningen. Den här stora radstorleken kan orsaka fel (till exempel fel 512) under vissa normala åtgärder, till exempel en klustrad indexnyckeluppdatering eller sortering av den fullständiga kolumnuppsättningen, som endast inträffar när en åtgärd utförs.

Konvertera teckendata

När teckenuttryck konverteras till en teckendatatyp av en annan storlek trunkeras värden som är för långa för den nya datatypen. Den unikaidentifieraren typ anses vara en teckentyp i syfte att konvertera från ett teckenuttryck och omfattas därför av trunkeringsreglerna för konvertering till en teckentyp. Se avsnittet Exempel.

När ett teckenuttryck konverteras till ett teckenuttryck av en annan datatyp eller storlek, till exempel från tecken(5) till varchar(5), eller tecken(20) till tecken(15), tilldelas sortering av indatavärdet till det konverterade värdet. Om ett icke-teckenuttryck konverteras till en teckendatatyp tilldelas standardsortering av den aktuella databasen till det konverterade värdet. I båda fallen kan du tilldela en specifik sortering med hjälp av satsen COLLATE.

Anmärkning

Kodsideöversättningar stöds för tecken och varchar datatyper, men inte för datatypen text. Precis som med tidigare versioner av SQL Server rapporteras inte dataförlust under kodsideöversättningar.

Teckenuttryck som konverteras till en ungefärlig numeriska datatyp kan innehålla valfri exponentiell notation. Den här notationen är ett gemener e eller versaler E följt av ett valfritt plustecken (+) eller minus (-) och sedan ett tal.

Teckenuttryck som konverteras till en exakt numerisk datatyp måste bestå av siffror, en decimal och ett valfritt plus (+) eller minus (-). Inledande blanksteg ignoreras. Kommaavgränsare, till exempel tusentalsavgränsaren i 123,456.00, tillåts inte i strängen.

Teckenuttryck som konverteras till pengar eller småpengar datatyper kan också innehålla ett valfritt decimaltecken och dollartecken ($). Kommaavgränsare, som i $123,456.00, tillåts.

När en tom sträng konverteras till en intblir dess värde 0. När en tom sträng konverteras till ett datum blir dess värde datum – vilket är 1900-01-01.

Exempel

A. Visa standardvärdet för n när det används i variabeldeklarationen

I följande exempel visas standardvärdet för n är 1 för tecken och varchar datatyper när de används i variabeldeklaration.

DECLARE @myVariable AS VARCHAR = 'abc';
DECLARE @myNextVariable AS CHAR = 'abc';

--The following query returns 1
SELECT DATALENGTH(@myVariable), DATALENGTH(@myNextVariable);
GO

B. Visa standardvärdet för n när varchar används med CAST och CONVERT

I följande exempel visas att standardvärdet för n är 30 när tecken eller varchar datatyper används med funktionerna CAST och 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. Konvertera data i visningssyfte

I följande exempel konverteras två kolumner till teckentyper och använder ett format som tillämpar ett specifikt format på de data som visas. En pengar typ konverteras till teckendata och formatmallar 1 används, som visar värdena med kommatecken var tredje siffra till vänster om decimaltecknet och två siffror till höger om decimaltecknet. En datetime- typ konverteras till teckendata och formatmallar 3 används, vilket visar data i formatet dd/mm/yy. I WHERE-satsen omvandlas en pengar typ till en teckentyp för att utföra en strängjämförelseåtgärd.

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%';

Här är resultatet.

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. Konvertera unikaidentifierardata

I följande exempel konverteras ett uniktidentifierarvärde till ett tecken datatyp.

DECLARE @myid UNIQUEIDENTIFIER = NEWID();
SELECT CONVERT(CHAR(255), @myid) AS 'char';

I följande exempel visas trunkeringen av data när värdet är för långt för den datatyp som konverteras till. Eftersom den unikaidentifieraren typ är begränsad till 36 tecken trunkeras de tecken som överskrider den längden.

DECLARE @ID NVARCHAR(MAX) = N'0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong';
SELECT @ID, CONVERT(UNIQUEIDENTIFIER, @ID) AS TruncatedValue;

Här är resultatet.

String                                     TruncatedValue
------------------------------------------ ------------------------------------
0E984725-C51C-4BF4-9960-E1C80E27ABA0wrong  0E984725-C51C-4BF4-9960-E1C80E27ABA0