Dela via


nchar och nvarchar (Transact-SQL)

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

Teckendatatyper som antingen har fast storlek, nchareller variabel storlek nvarchar. I SQL Server 2012 (11.x) och senare versioner, när en extra tecken (SC) aktiverad sortering används, lagrar dessa datatyper hela intervallet av Unicode- teckendata och använder UTF-16 teckenkodning. Om en icke-SC-sortering anges lagrar dessa datatyper endast den delmängd av teckendata som stöds av UCS-2 teckenkodning.

Argument

nchar [ ( n ) ]

Strängdata med fast storlek. n definierar strängstorleken i bytepar och måste vara ett värde från 1 till 4 000. Lagringsstorleken är två gånger n byte. För UCS-2 kodning är lagringsstorleken två gånger n byte och antalet tecken som kan lagras är också n. För UTF-16-kodning är lagringsstorleken fortfarande två gånger n byte, men antalet tecken som kan lagras kan vara mindre än n, eftersom tilläggstecken använder två bytepar (kallas även surrogatpar). ISO-synonymerna för nchar är nationella tecken och nationella tecken.

nvarchar [ ( n | max ) ]

Strängdata med variabel storlek. Värdet för n definierar strängstorleken i bytepar och kan vara mellan 1 och 4 000. max anger att den maximala lagringsstorleken är 2^31–1 tecken (2 GB). Lagringsstorleken är två gånger n byte + 2 byte. För UCS-2 kodning är lagringsstorleken två gånger n byte + 2 byte och antalet tecken som kan lagras är också n. För UTF-16-kodning är lagringsstorleken fortfarande två gånger n byte + 2 byte. Antalet tecken som kan lagras kan dock vara mindre än n, eftersom tilläggstecken använder två bytepar (kallas även surrogatpar). ISO-synonymerna för nvarchar är nationella tecken som varierar och nationella tecken som varierar.

Anmärkningar

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

Missuppfattningen inträffar eftersom när du använder tecken som definierats i Unicode-intervallet 0 till 65 535 kan ett tecken lagras per bytepar. Men i högre Unicode-intervall (65 536 till 1 114 111) kan ett tecken använda två bytepar. I en kolumn som definieras som nchar(10)kan databasmotorn till exempel lagra 10 tecken som använder ett bytepar (Unicode-intervall 0 till 65 535), men färre än 10 tecken när du använder två bytepar (Unicode-intervall 65 536 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. När n inte anges med funktionen CAST är standardlängden 30.

Om du använder nchar eller nvarcharrekommenderar vi att du:

  • Använd nchar när kolumndataposternas storlekar är konsekventa.
  • Använd nvarchar när storleken på kolumndataposterna varierar avsevärt.
  • Använd nvarchar(max) när storleken på kolumndataposterna varierar avsevärt och stränglängden kan överstiga 4 000 bytepar.

sysname är en användardefinierad datatyp som är funktionellt likvärdig med nvarchar(128), förutom att den inte är nullbar. sysname används för att referera till databasobjektnamn.

Objekt som använder nchar eller nvarchar tilldelas standardsortering av databasen såvida inte en specifik sortering tilldelas med hjälp av COLLATE-satsen.

SET ANSI_PADDING är alltid ON för nchar och nvarchar. SET ANSI_PADDING OFF gäller inte för nchar eller nvarchar datatyper.

Prefixa en Unicode-teckensträngskonstant med bokstaven N för att signalera UCS-2- eller UTF-16-indata, beroende på om en SC-sortering används eller inte. Utan prefixet N konverteras strängen till standardkodsidan för databasen som kanske inte känner igen vissa tecken. I SQL Server 2019 (15.x) och senare versioner, när en UTF-8-aktiverad sortering används, kan standardkodsidan lagra Unicode UTF-8-teckenuppsättningen.

När du prefixar en strängkonstant med bokstaven Nresulterar den implicita konverteringen i en UCS-2- eller UTF-16-sträng om konstanten som ska konverteras inte överskrider maxlängden för nvarchar strängdatatyp (4 000). Annars resulterar den implicita konverteringen i ett stort värde nvarchar(max).

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. Dessa ytterligare byte kan skapa en implicit gräns för antalet icke-null-varchar(max) eller nvarchar(max) kolumner 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) som användarna kanske inte förväntar sig under vissa normala åtgärder. Två exempel på åtgärder är en klustrad indexnyckeluppdatering eller sortering av den fullständiga kolumnuppsättningen.

Konvertera teckendata

Information om hur du konverterar teckendata finns i tecken och varchar. Mer information om hur du konverterar mellan datatyper finns i CAST och CONVERT.