¿Cuál es la diferencia entre char, nchar, varchar y nvarchar en SQL Server?

Resuelto MrDatabase asked hace 15 años • 12 respuestas

Qué quiere decir nvarchar?

¿Cuál es la diferencia entre char, nchar, varchary nvarcharen SQL Server?

MrDatabase avatar Oct 07 '08 05:10 MrDatabase
Aceptado

Sólo para aclarar... o resumir...

  • nchary nvarcharpuede almacenar caracteres Unicode .
  • chary no puede almacenar caracteres Unicode.varchar
  • chary nchartienen una longitud fija que reservará espacio de almacenamiento para la cantidad de caracteres que especifique, incluso si no utiliza todo ese espacio.
  • varchary nvarcharson de longitud variable que solo utilizarán espacios para los caracteres que almacene. No reservará almacenamiento como charonchar .

nchary nvarcharocuparán el doble de espacio de almacenamiento, por lo que puede ser aconsejable utilizarlos sólo si necesita compatibilidad con Unicode .

Brian Kim avatar Oct 06 '2008 23:10 Brian Kim

Todas las respuestas hasta ahora indican que varchares de un solo byte o nvarchar de doble byte. La primera parte de esto en realidad 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

ingrese la descripción de la imagen aquí

Tenga en cuenta que los caracteres y todavía no estaban representados en la VARCHARversión y fueron reemplazados silenciosamente por ?.

En realidad, todavía no hay caracteres chinos que puedan representarse con un solo byte en esa clasificación. Los únicos caracteres de un solo byte son el típico conjunto ASCII occidental.

Debido a esto, es posible que una inserción de una nvarchar(X)columna a otra varchar(X)falle 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 suplementario) que admiten archivos UTF-16. En estas intercalaciones un solo nvarcharcarácter puede ocupar 2 o 4 bytes.

Martin Smith avatar Nov 23 '2011 23:11 Martin Smith

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 almacena 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 ésta .

Luke Bennett avatar Oct 06 '2008 22:10 Luke Bennett

Sólo para agregar algo más: nchar : agrega espacios finales a los datos. nvarchar : no agrega espacios finales a los datos.

Por lo tanto, si va a filtrar su conjunto de datos por un campo 'nchar', es posible que desee utilizar RTRIM para eliminar los espacios. Por ejemplo, el campo nchar(10) llamado MARCA almacena la palabra NIKE. Agrega 6 espacios a la derecha de la palabra. Entonces, al filtrar, la expresión debería leer: RTRIM(Fields!BRAND.Value) = "NIKE"

¡Espero que esto ayude a alguien porque estuve luchando con eso por un momento!

Dimuthu avatar Jul 21 '2011 05:07 Dimuthu