Solución:
Solo para aclarar … o resumir …
-
nchar
ynvarchar
puede almacenar Unicode caracteres. -
char
yvarchar
no se puede almacenar Unicode caracteres. -
char
ynchar
están longitud fija que lo hará reservar espacio de almacenamiento para el número de caracteres que especifique incluso si no utiliza todo ese espacio. -
varchar
ynvarchar
están Longitud variable que solo utilizará espacios para los personajes que almacenes. Eso no reservará almacenamiento comochar
onchar
.
nchar
y nvarchar
ocuparán el doble de espacio de almacenamiento, por lo que puede ser aconsejable utilizarlos solo si los necesita Unicode apoyo.
Todas las respuestas hasta ahora indican que varchar
es de un solo byte, nvarchar
es de doble byte. La primera parte de esto realmente depende de la intercalación, como se ilustra a continuación.
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
Devoluciones
Tenga en cuenta que el 华
y 国
Los personajes todavía no estaban representados en el VARCHAR
versión y fueron reemplazados silenciosamente con ?
.
En realidad, todavía no hay caracteres chinos que puedan ser representados por un solo byte en esa intercalación. Los únicos caracteres de un solo byte son el conjunto típico de ASCII occidental.
Debido a esto, es posible que un inserto de un nvarchar(X)
columna a una varchar(X)
columna fallar con un error de truncamiento (donde X denota un número que es el mismo en ambos casos).
SQL Server 2012 agrega intercalaciones SC (carácter complementario) que admiten UTF-16
. En estas colaciones un solo nvarchar
El carácter puede ocupar 2 o 4 bytes.
nchar y char funcionan prácticamente de la misma manera entre sí, al igual que nvarchar y varchar. La única diferencia entre ellos es que nchar / nvarchar almacenan caracteres Unicode (esencial si necesita el uso de conjuntos de caracteres extendidos) mientras que varchar no.
Debido a que los caracteres Unicode requieren más almacenamiento, los campos nchar / nvarchar ocupan el doble de espacio (por ejemplo, en versiones anteriores de SQL Server, el tamaño máximo de un campo nvarchar es 4000).
Esta pregunta es un duplicado de esta.