340 votos

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

¿Qué se entiende por nvarchar?

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

485voto

Brian Kim Puntos 8951

Solo para aclarar... o resumir...

  • nchar y nvarchar pueden almacenar caracteres Unicode.
  • char y varchar no pueden almacenar caracteres Unicode.
  • char y nchar son de longitud fija, lo que reservará espacio de almacenamiento para el número de caracteres que especifiques, incluso si no utilizas todo ese espacio.
  • varchar y nvarchar son de longitud variable, lo que solo utilizará espacios para los caracteres que almacenes. No reservará espacio como char o nchar.

nchar y nvarchar ocuparán el doble de espacio de almacenamiento, por lo que puede ser prudente usarlos solo si necesitas soporte Unicode.

49voto

Martin Smith Puntos 174101

Todas las respuestas hasta ahora indican que varchar es de un solo byte, nvarchar es de dos bytes. La primera parte de esto en realidad depende de la colació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  

Devuelve

enter image description here

Observa que los caracteres y no se representaron en la versión VARCHAR y fueron reemplazados silenciosamente por ?.

De hecho, aún no hay caracteres chinos que puedan ser representados por un solo byte en esa colación. Los únicos caracteres de un solo byte son el típico conjunto de caracteres ASCII occidentales.

Debido a esto, es posible que una inserción de una columna nvarchar(X) a una columna varchar(X) falle con un error de truncamiento error de truncamiento (donde X denota un número que es el mismo en ambas instancias).

SQL Server 2012 agrega colaciones SC (Supplementary Character) que admiten UTF-16. En estas colaciones, un solo caracter nvarchar puede ocupar 2 o 4 bytes.

33voto

Luke Bennett Puntos 16100

Nchar y char funcionan prácticamente de la misma manera, 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 de 4000).

Esta pregunta es un duplicado de esta.

22voto

Dimuthu Puntos 151

Solo para agregar algo más: nchar - agrega espacios adicionales al final de los datos. nvarchar - no agrega espacios adicionales al final de los datos.

Entonces, si vas a filtrar tu conjunto de datos por un campo 'nchar', es posible que desees usar 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. Por lo tanto, al filtrar, la expresión debería ser: RTRIM(Fields!BRAND.Value) = "NIKE"

¡Espero que esto ayude a alguien porque yo estaba luchando un poco con esto hace un momento!

12voto

ss. Puntos 111
  • char: datos de caracteres de longitud fija con una longitud máxima de 8000 caracteres.
  • nchar: datos Unicode de longitud fija con una longitud máxima de 4000 caracteres.
  • Char = longitud de 8 bits
  • NChar = longitud de 16 bits

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X