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


Qué quiere decir nvarchar?

Cuál es la diferencia entre char, nchar, varchary nvarchar en SQL Server?


516
2017-10-06 22:47


origen


Respuestas:


Solo para aclarar ... o resumir ...

  • nchar y nvarchar puede almacenar Unicode caracteres.
  • char y varchar  no puede almacenar Unicode caracteres.
  • char y nchar son longitud fija que lo hará reservar espacio de almacenamiento para la cantidad de caracteres que especifique aunque no agote todo ese espacio.
  • varchar y nvarchar son Longitud variable que solo usará espacios para los personajes que almacene. Eso no reservará almacenamiento como char o nchar.

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


721
2017-10-06 23:02



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 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  

Devoluciones

enter image description here

Tenga en cuenta que  y  los personajes todavía no estaban representados en el VARCHAR versión y fueron reemplazados en silencio con ?.

En realidad, aún no hay caracteres chinos que puedan ser replanificados por un solo byte en esa colació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 a varchar(X) columna para fallar con un error de truncamiento (donde X denota un número que es el mismo en ambas instancias).

SQL Server 2012 agrega colaciones SC (caracteres complementarios) que admiten UTF-16. En estas colaciones un solo nvarchar el personaje puede tomar 2 o 4 bytes.


79
2017-11-23 23:37



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 caracteres Unicode (esencial si requiere 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 lo que, 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 éste.


33
2017-10-06 22:51



Solo 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', puede usar RTRIM para eliminar los espacios. P.ej. El campo nchar (10) llamado BRAND almacena la palabra NIKE. Agrega 6 espacios a la derecha de la palabra. Por lo tanto, al filtrar, la expresión debería decir: RTRIM (Fields! BRAND.Value) = "NIKE"

Espero que esto ayude a alguien por ahí porque estaba luchando con eso por un tiempo.


30
2017-07-21 05:34



Mi intento de resumir y corregir las respuestas existentes:

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

El segundo punto importante para entender es que, nchar y nvarchar cadenas de tiendas usando exactamente dos bytes por personaje, mientras que char y varchar utilice una codificación determinada por la página de códigos de intercalación, que generalmente ser exactamente un byte por personaje (aunque hay excepciones, ver abajo). Al usar dos bytes por carácter, se puede almacenar una amplia gama de caracteres, por lo que lo más básico que hay que recordar aquí es que nchar y nvarchar tienden a ser una opción mucho mejor cuando se quiere soporte de internacionalización, lo que probablemente se haga.

Ahora para algunos algunos puntos más finos.

Primero, nchar y nvarchar columnas siempre almacenar datos usando 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) puede ser almacenado por un nchar o nvarchar campo. Sin embargo, no es el caso alguna El carácter Unicode se puede almacenar. Por ejemplo, según Wikipedia, los puntos de código para los jeroglíficos egipcios quedan fuera del BMP. Hay, por lo tanto, cadenas Unicode que se pueden representar en UTF-8 y otras codificaciones Unicode verdaderas que no se pueden almacenar en un Servidor SQL nchar o nvarchar campo, y las cuerdas escritas en jeroglíficos egipcios estarían entre ellos. Afortunadamente, es probable que tus usuarios no escriban en esa secuencia de comandos, ¡pero es algo a tener en cuenta!

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

ACTUALIZAR: A partir de SQL Server 2012, finalmente hay páginas de códigos para UTF-16, por ejemplo Latin1_General_100_CI_AS_SC, que realmente puede cubrir todo el rango Unicode.


20
2018-06-27 05:41



  • 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 = 8 bits de longitud
  • NChar = 16 bit de longitud

14
2017-11-02 09:35



nchar[(n)]   (caracter nacional)

  • Longitud fija Unicode datos de cadena
  • n define la longitud de la cadena y debe ser un valor de 1 a 4.000.
  • El tamaño de almacenamiento es dos veces n bytes.

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

  • Longitud variable Unicode datos de cadena
  • n define la longitud de la cadena y puede ser un valor de 1 a 4.000.
  • max indica que el tamaño de almacenamiento máximo es de 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)] (personaje)

  • Longitud fija, non-Unicode datos de cadena
  • n define la longitud de la cadena y debe ser un valor de 1 a 8,000.
  • El tamaño de almacenamiento es n bytes.

varchar [(n | max)] (personaje variando)

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

9
2018-02-10 14:17



Las diferencias son:

  1. n [var] char almacena unicode mientras que [var] char solo almacena caracteres de un solo 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 de longitud. Y char y varchar pueden tener hasta 8000 caracteres de longitud. 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).


7
2017-11-02 10:33



nchar requiere más espacio que nvarchar.

p.ej,

Una char (100) siempre almacenará 100 caracteres incluso si solo ingresa 5, la los 95 caracteres restantes se rellenarán con espacios. Al almacenar 5 caracteres en un varchar (100) se guardarán 5 caracteres.


7
2017-11-18 11:04



nchar (10) es una cadena de longitud fija Unicode de longitud 10. nvarchar (10) es una cadena Unicode de longitud variable con una longitud máxima de 10. Típicamente, usaría la primera si todos los valores de los datos son 10 caracteres y la última si las longitudes varían


5
2017-10-06 22:53



  • nchar es de longitud fija y puede contener caracteres Unicode. usa dos bytes de almacenamiento por personaje.

  • Varchar es de longitud variable y no puede contener caracteres Unicode. usa un byte de almacenamiento por personaje.


4
2017-10-06 22:59