¿Qué se entiende por nvarchar
?
¿Cuál es la diferencia entre char
, nchar
, varchar
y nvarchar
en SQL Server?
sql-server
varchar
MrDatabase
fuente
fuente
n...
versiones ocupan o no el doble de espacio de almacenamiento que muestra mi respuestaTodas 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.Devoluciones
Tenga en cuenta que el
华
y国
los caracteres aún no estaban representados en laVARCHAR
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 unavarchar(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 solonvarchar
carácter puede tomar 2 o 4 bytes.fuente
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 .
fuente
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!
fuente
Mi intento de resumir y corregir las respuestas existentes:
En primer lugar,
char
ynchar
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 quevarchar
ynvarchar
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
ynvarchar
almacenar cadenas usando exactamente dos bytes por carácter, mientras quechar
yvarchar
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 esonchar
ynvarchar
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 lasnvarchar
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 camponchar
onvarchar
. 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 servidornchar
onvarchar
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
yvarchar
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.
fuente
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 bitsfuente
char
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).fuente
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).
fuente
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.
fuente
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.
fuente
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.
fuente
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.aspxNVARCHAR puede almacenar caracteres Unicode y ocupa 2 bytes por carácter.
fuente
nvarchar
siempre toma 2 bytes por carácter.