sql-server - nchar - varchar char nvarchar
¿Cuál es la diferencia entre char, nchar, varchar y nvarchar en SQL Server? (12)
¿Qué se entiende por nvarchar
?
¿Cuál es la diferencia entre char
, nchar
, varchar
y nvarchar
en SQL Server?
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, presumiblemente 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ódigos de intercalación, que generalmente será exactamente un byte por carácter (aunque hay excepciones, vea abajo). Al usar dos bytes por carácter, se puede almacenar una amplia gama de caracteres, por lo que lo básico que se debe recordar aquí es que nchar
y nvarchar
tienden a ser una opción mucho mejor cuando se desea la compatibilidad con la internacionalización, lo que probablemente haga.
Ahora para algunos puntos más finos.
Primero, las nchar
y nvarchar
siempre almacenan 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) se puede almacenar mediante 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
SQL Server, y las cadenas escritas en jeroglíficos egipcios se encuentran entre ellas. Afortunadamente, sus usuarios probablemente no escriban en ese script, ¡pero es algo a tener en cuenta!
Otro punto confuso pero interesante que otros carteles 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 de códigos para UTF-16 , por ejemplo, Latin1_General_100_CI_AS_SC, que puede cubrir verdaderamente todo el rango de Unicode.
Sólo para aclarar ... o resumir ...
-
nchar
ynvarchar
pueden almacenar caracteres Unicode . -
char
yvarchar
no pueden almacenar caracteres Unicode . -
char
ynchar
tienen una longitud fija que reservará espacio de almacenamiento para la cantidad de caracteres que especifique, incluso si no usa todo ese espacio. -
varchar
ynvarchar
son de longitud variable que solo usarán espacios para los caracteres que almacena. No se reservará almacenamiento comochar
onchar
.
nchar
y nvarchar
ocuparán el doble de espacio de almacenamiento, por lo que puede ser conveniente utilizarlos solo si necesita soporte de Unicode .
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'', es posible que desee utilizar RTRIM para eliminar los espacios. Por ejemplo, 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 debe leer: RTRIM (Fields! BRAND.Value) = "NIKE"
¡Espero que esto ayude a alguien por ahí porque estaba luchando con eso por un momento!
Todas las respuestas hasta ahora indican que varchar
es un byte único, nvarchar
es un byte doble. La primera parte de esto realmente 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
Tenga en cuenta que los caracteres 华
y 国
aún no estaban representados en la versión VARCHAR
y fueron reemplazados 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 que una inserción de una columna nvarchar(X)
a una columna 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 colaciones SC (caracteres suplementarios) que admiten UTF-16
. En estas colaciones, un solo carácter nvarchar
puede tomar 2 o 4 bytes.
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 la última. si las longitudes varían.
nchar requiere más espacio que nvarchar.
p.ej,
Un char (100) siempre almacenará 100 caracteres, incluso si solo ingresa 5, los 95 caracteres restantes se rellenarán con espacios. Almacenar 5 caracteres en una varchar (100) guardará 5 caracteres.
nchar y char prácticamente funcionan exactamente 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 (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 este .
msdn.microsoft.com/en-us/library/ms186939.aspx son:
- n [var] char almacena Unicode mientras que [var] char solo almacena caracteres de un solo byte.
- [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 con signo).
nchar[(n)]
(carácter nacional)
- Datos de cadena Unicode de longitud fija.
-
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.)
- Datos de cadena de Unicode de longitud variable.
-
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). - El tamaño de almacenamiento, en bytes, es dos veces la longitud real de los datos ingresados + 2 bytes
char [(n)]
(personaje)
- Datos de cadena
non-Unicode
longitud fija. -
n
define la longitud de la cadena y debe ser un valor entre 1 y 8,000. - El tamaño de almacenamiento es
n
bytes.
varchar [(n | max)]
(variando el carácter)
- Datos de cadena no Unicode de longitud 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). - El tamaño de almacenamiento es la longitud real de los datos introducidos + 2 bytes.
NVARCHAR puede almacenar caracteres Unicode y toma 2 bytes por carácter.
-
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
= 16 bits de longitud
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 byte de almacenamiento por carácter.