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

StackOverflow https://stackoverflow.com/questions/176514

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Qué se entiende por nvarchar ?

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

¿Fue útil?

Solución

Solo para aclarar ... o resumir ...

  • nchar y nvarchar puede almacenar Unicode caracteres.
  • char y varchar no puede almacenar caracteres Unicode .
  • char y nchar son de longitud fija que reserva espacio de almacenamiento para la cantidad de caracteres que especifiques, incluso si no usas todo ese espacio.
  • varchar y nvarchar son de longitud variable que solo se agotarán Espacios para los personajes que almacenes. No reservará almacenamiento como char o nchar .

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

Otros consejos

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

 introduce la descripción de la imagen aquí

Tenga en cuenta que los caracteres ? y todavía no estaban representados en la versión VARCHAR y se reemplazaron 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 ASCII occidental típico.

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

SQL Server 2012 agrega intercalaciones de SC (caracteres suplementarios) que admiten UTF-16 . En estas colaciones, un solo carácter nvarchar puede tomar 2 o 4 bytes.

nchar y char funcionan prácticamente de la misma manera que los demás, al igual que nvarchar y varchar. La única diferencia entre ellos es que nchar / nvarchar almacena los caracteres Unicode (esenciales si necesita el uso de juegos 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 this .

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

Entonces, si va a filtrar su conjunto de datos por un campo 'nchar', es posible que desee utilizar RTRIM para eliminar los espacios. P.ej. El campo nchar (10) llamado BRAND almacena la palabra NIKE. Añade 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 por ahí porque estuve luchando con eso por un momento!

Mi intento de resumir y corregir las respuestas existentes:

Primero, char y nchar siempre usarán una cantidad fija de espacio de almacenamiento, incluso cuando la cadena a almacenar sea más pequeña que el espacio disponible, mientras que varchar y nvarchar usarán solo el espacio de almacenamiento necesario para almacenar esa cadena (más dos bytes de sobrecarga, probablemente para almacenar la longitud de la cadena). Así que recuerda, " var " significa " variable " ;, como en el espacio variable.

El segundo punto importante que hay que entender es que nchar y nvarchar almacenan cadenas usando exactamente dos bytes por carácter, mientras que char y varchar usan una codificación determinada por la página de código de intercalación, que usualmente será exactamente un byte por carácter (aunque hay excepciones, vea más abajo). Al utilizar dos bytes por carácter, se puede almacenar una amplia gama de caracteres, por lo que lo más básico que se debe recordar es que nchar y nvarchar tienden a ser una opción mucho mejor. cuando quiera soporte de internacionalización, lo que probablemente haga.

Ahora, para algunos puntos más finos.

Primero, las columnas nchar y nvarchar siempre almacenan datos mediante UCS-2. Esto significa que se usarán exactamente dos bytes por carácter, y cualquier carácter Unicode en el Plano Multilingüe Básico (BMP) se puede almacenar en un campo nchar o nvarchar . Sin embargo, no es el caso que se pueda almacenar cualquier carácter Unicode. Por ejemplo, según Wikipedia, los puntos de código para los jeroglíficos egipcios están fuera del BMP. Por lo tanto, hay cadenas Unicode que se pueden representar en UTF-8 y otras codificaciones Unicode verdaderas que no se pueden almacenar en un campo nchar o nvarchar de SQL Server y cadenas escritas En los jeroglíficos egipcios estarían entre ellos. Afortunadamente, sus usuarios probablemente no escriban en ese script, ¡pero es algo a tener en cuenta!

Otro punto confuso pero interesante que otros pósters han resaltado es que los campos char y varchar pueden usar dos bytes por carácter para ciertos caracteres si la página de códigos de intercalación lo requiere. (Martin Smith da un excelente ejemplo en el que muestra cómo Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS muestra este comportamiento. Compruébelo).

ACTUALIZACIÓN: A partir de SQL Server 2012, finalmente hay páginas para UTF-16 , por ejemplo, Latin1_General_100_CI_AS_SC, que puede cubrir verdaderamente todo el rango Unicode.

  • 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

nchar[(n)? (carácter nacional)

  • Datos de cadena Unicode de longitud fija.
  • n define la longitud de la cadena y debe tener un valor entre 1 y 4,000.
  • El tamaño de almacenamiento es dos veces n bytes.

nvarchar [(n | max)] (varía el carácter nacional.)

  • Datos de cadena Unicode de longitud variable.
  • n define la longitud de la cadena y puede tener un valor de 1 a 4,000.
  • max indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB).
  • El tamaño de almacenamiento, en bytes, es dos veces la longitud real de los datos ingresados ??+ 2 bytes

char [(n)] (carácter)

  • Datos de cadena no Unicode de longitud fija.
  • n define la longitud de la cadena y debe tener un valor entre 1 y 8,000.
  • El tamaño de almacenamiento es n bytes.

varchar [(n | max)] (varía el carácter)

  • Datos de cadena no Unicode de longitud variable.
  • n define la longitud de la cadena y puede tener un valor entre 1 y 8,000.
  • max indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB).
  • El tamaño de almacenamiento es la longitud real de los datos ingresados ??+ 2 bytes.

Las diferencias son:

  1. n [var] char almacena Unicode mientras que [var] char solo almacena caracteres de un byte.
  2. [n] char requiere un número fijo de caracteres de la longitud exacta, mientras que [n] varchar acepta un número variable de caracteres hasta e incluyendo la longitud definida.

Otra diferencia es la longitud. Tanto nchar como nvarchar pueden tener hasta 4,000 caracteres. Y char y varchar pueden tener hasta 8000 caracteres. Pero para SQL Server también puede usar un [n] varchar (max) que puede manejar hasta 2,147,483,648 caracteres. (Dos gigabytes, un entero de 4 bytes firmado).

nchar requiere más espacio que nvarchar.

eg ,

Un char (100) siempre almacenará 100 caracteres, incluso si solo ingresa 5, el Los 95 caracteres restantes serán rellenados con espacios. Almacenar 5 caracteres en una varchar (100) guardará 5 caracteres.

nchar (10) es una cadena Unicode de longitud fija de longitud 10. nvarchar (10) es una cadena Unicode de longitud variable con una longitud máxima de 10. Por lo general, usaría la primera si todos los valores de datos tienen 10 caracteres. y esto último si las longitudes varían.

  • nchar es de longitud fija y puede contener caracteres Unicode. utiliza dos bytes de almacenamiento por carácter.

  • varchar es de longitud variable y no puede contener caracteres Unicode. utiliza un almacenamiento de un byte por carácter.

NVARCHAR puede almacenar caracteres Unicode y toma 2 bytes por carácter.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top