¿Qué se entiende por nvarchar
?
¿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?
Respuestas:
Solo para aclarar ... o resumir ...
nchar
y nvarchar
puede almacenar caracteres Unicode .char
y no puede almacenar caracteres Unicode .varchar
char
y nchar
tienen una longitud fija que reservará espacio de almacenamiento para la cantidad de caracteres que especifique, incluso si no usa todo ese espacio.varchar
y nvarchar
tienen una longitud variable que solo usará espacios para los caracteres que almacene. No reservará almacenamiento como char
onchar
.nchar
y nvarchar
ocupará el doble de espacio de almacenamiento, por lo que puede ser conveniente usarlos solo si necesita soporte Unicode .
n...
versiones ocupan o no el doble de espacio de almacenamiento que muestra mi respuesta
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 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
Tenga en cuenta que el 华
y 国
los caracteres aún no estaban representados en la VARCHAR
versión y se reemplaza con silencio ?
.
En realidad, todavía no hay caracteres chinos que puedan ser representados por un solo byte en esa clasificación. Los únicos caracteres de un solo byte son el conjunto ASCII occidental típico.
Debido a esto, es posible que una inserción de una nvarchar(X)
columna a una varchar(X)
columna falle con un error de truncamiento (donde X denota un número que es el mismo en ambas instancias).
SQL Server 2012 agrega intercalaciones SC (caracteres suplementarios) que admiten UTF-16
. En estas intercalaciones, un solo nvarchar
carácter 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 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 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 .
Solo 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', puede usar RTRIM para eliminar los espacios. Por ejemplo, el campo nchar (10) llamado BRAND 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 por ahí porque estaba luchando con eso por un momento!
Mi intento de resumir y corregir las respuestas existentes:
En primer lugar, char
y nchar
siempre va a utilizar una cantidad fija de espacio de almacenamiento, incluso cuando la cadena a ser almacenado es menor que el espacio disponible, mientras que varchar
y nvarchar
se utilice sólo como espacio de almacenamiento tanto como sea necesario para almacenar esa cadena (más dos bytes de sobrecarga, presumiblemente para almacenar la longitud de la cadena). Entonces recuerde, "var" significa "variable", como en el espacio variable.
El segundo punto importante a entender es eso, nchar
y nvarchar
almacenar cadenas usando exactamente dos bytes por carácter, mientras que char
y varchar
usar una codificación determinada por la página de códigos de clasificación, que generalmente será exactamente un byte por carácter (aunque hay excepciones, ver más abajo). Al usar dos bytes por carácter, se puede almacenar un rango muy amplio de caracteres, por lo que lo básico a recordar aquí es eso nchar
y nvarchar
tiende a ser una opción mucho mejor cuando se necesita soporte de internacionalización, lo que probablemente se haga.
Ahora para algunos puntos más finos.
Primero, nchar
y las nvarchar
columnas siempre almacenan datos usando UCS-2. Esto significa que se utilizarán exactamente dos bytes por carácter, y cualquier carácter Unicode en el plano multilingüe básico (BMP) puede almacenarse mediante un campo nchar
o nvarchar
. Sin embargo, no se puede almacenar ningún carácter Unicode. Por ejemplo, según Wikipedia, los puntos de código para los jeroglíficos egipcios quedan 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 servidor nchar
o nvarchar
campo SQL , y las cadenas escritas en jeroglíficos egipcios estarían entre ellas. Afortunadamente, sus usuarios probablemente no escriban en ese script, ¡pero es algo a tener en cuenta!
Otro punto interesante confuso, pero que otros críticos se han puesto de manifiesto que es char
y varchar
campos pueden usar dos bytes por carácter para ciertos caracteres si la página de códigos de colación lo requiere. (Martin Smith da un excelente ejemplo en el que muestra cómo Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS exhibe este comportamiento. Compruébelo).
ACTUALIZACIÓN: 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 pueden cubrir 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 bitsNChar
= Longitud de 16 bitschar
no podría tener una longitud de 8 bits. No tiene que almacenar la longitud, y la longitud fija puede ser de hasta 8000 caracteres.
nchar[(n)]
(caracter nacional)
n
define la longitud de la cadena y debe ser un valor de 1 a 4.000.n
bytes.nvarchar [(n | max)]
(El carácter nacional varía).
n
define la longitud de la cadena y puede ser un valor de 1 a 4,000.max
indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB).char [(n)]
(personaje)
non-Unicode
datos de cadena.n
define la longitud de la cadena y debe ser un valor de 1 a 8,000.n
bytes.varchar [(n | max)]
(carácter variable)
n
define la longitud de la cadena y puede ser un valor de 1 a 8,000.max
indica que el tamaño máximo de almacenamiento es 2 ^ 31-1 bytes (2 GB).Las diferencias son:
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).
nchar requiere más espacio que nvarchar.
p.ej,
Un nchar (100) siempre almacenará 100 caracteres, incluso si solo ingresa 5, los 95 caracteres restantes se rellenarán con espacios. El almacenamiento de 5 caracteres en un nvarchar (100) ahorrará 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. Normalmente, usaría el primero si todos los valores de datos son 10 caracteres y el ú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 bytes por carácter.
UCS-2
(que pasa a ser la codificación utilizada por SQL Server) almacena todos los personajes en exactamente dos bytes, ver msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 puede usar la compresión SCSU, pero sigue siendo compresión de las cadenas Unicode codificadas en UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHAR puede almacenar caracteres Unicode y ocupa 2 bytes por carácter.
nvarchar
siempre toma 2 bytes por carácter.