nchar y nvarchar (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Los tipos de datos de caracteres son de tamaño fijo, nchar, o de tamaño variable, nvarchar. A partir de SQL Server 2012 (11.x), cuando se usa una intercalación con carácter complementario (SC) habilitado, estos tipos de datos almacenan el intervalo completo de datos de caracteres Unicode y usan la codificación de caracteres UTF-16. Si se especifica una intercalación que no es de tipo SC, estos tipos de datos almacenan solo el subconjunto de datos de caracteres admitidos por la codificación de caracteres UCS-2.

Argumentos

nchar [ ( n ) ]

Datos de cadena de tamaño fijo. n define el tamaño de la cadena en pares de bytes y debe ser un valor entre 1 y 4.000. El tamaño de almacenamiento es dos veces n bytes. Para la codificación UCS-2, el tamaño de almacenamiento es el doble de n bytes y el número de caracteres que se pueden almacenar también en n. Para la codificación UTF-16, el tamaño de almacenamiento sigue siendo el doble de n bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n, porque los caracteres complementarios usan dos pares de bytes (también denominados par suplente). Los sinónimos ISO de nchar son national char y national character.

nvarchar [ ( n | max ) ]

Datos de cadena de tamaño variable. n define el tamaño de la cadena en pares de bytes y puede ser un valor entre 1 y 4.000. max indica que el tamaño máximo de almacenamiento es de 2^31-1 caracteres (2 GB). El tamaño de almacenamiento es el doble de n bytes + 2 bytes. Para la codificación UCS-2, el tamaño de almacenamiento es el doble de n bytes + 2 bytes y el número de caracteres que se pueden almacenar también en n. Para la codificación UTF-16, el tamaño de almacenamiento sigue siendo el doble de n bytes + 2 bytes, pero el número de caracteres que se pueden almacenar puede ser menor que n, porque los caracteres complementarios usan dos pares de bytes (también denominados par suplente). Los sinónimos ISO de nvarchar son national char varying y national character varying.

Comentarios

Una idea equivocada habitual es pensar que, en nchar(n) y nvarchar(n), la n define el número de caracteres. Sin embargo, en nchar(n) y nvarchar(n), la n define la longitud de la cadena en pares de bytes (0 - 4.000). n nunca define números de caracteres que se pueden almacenar. Esto es similar a la definición de char(n) y varchar(n).

La idea equivocada se produce porque cuando se usan caracteres definidos en el intervalo de 0 a 65.535 de Unicode, se puede almacenar un carácter por cada par de bytes. Sin embargo, en intervalos de Unicode más altos (de 65.536 a 1.114.111), un carácter puede usar dos pares de bytes. Por ejemplo, en una columna definida como nchar(10), el Motor de base de datos puede almacenar 10 caracteres que usan un par de bytes (intervalo de Unicode de 0 a 65.535), pero menos de 10 caracteres cuando se usan dos pares de bytes (intervalo de Unicode de 65.536 a 1.114.111). Para obtener más información sobre el almacenamiento Unicode y los intervalos de caracteres, vea Diferencias de almacenamiento entre UTF-8 y UTF-16.

Cuando no se especifica n en una instrucción de definición de datos o de declaración de variable, la longitud predeterminada es 1. Cuando no se especifica n con la función CAST, la longitud predeterminada es 30.

Si usa nchar o nvarchar, se recomienda que:

  • Utilice nchar cuando los tamaños de las entradas de datos de columna sean coherentes.
  • Use nvarchar cuando los tamaños de las entradas de datos de columna varíen considerablemente.
  • Utilice nvarchar(max) cuando los tamaños de las entradas de datos de columna varíen de forma considerable y la longitud de la cadena pueda superar los 4000 pares de bytes.

sysname es un tipo de datos definido por el usuario y suministrado por el sistema que es funcionalmente equivalente a nvarchar(128), excepto en que no acepta valores NULL. sysname se usa para hacer referencia a nombres de objetos de base de datos.

Los objetos que usan nchar o nvarchar se asignan a la intercalación predeterminada de la base de datos, a menos que se asigne una intercalación específica por medio de la cláusula COLLATE.

SET ANSI_PADDING siempre es ON para nchar y nvarchar. SET ANSI_PADDING OFF no se aplica a los tipos de datos nchar o nvarchar.

Anteponga un prefijo de constantes de cadena de caracteres Unicode con la letra N para señalar una entrada UCS-2 o UTF-16, en función de si se utiliza una intercalación SC o no. Sin el prefijo N, la cadena se convierte a la página de códigos predeterminada de la base de datos, que puede no reconocer determinados caracteres. A partir de SQL Server 2019 (15.x), cuando se utiliza una intercalación con UTF-8 habilitado, la página de códigos predeterminada es capaz de almacenar el juego de caracteres Unicode UTF-8.

Cuando se antepone un prefijo con la letra N en una constante de cadena, la conversión implícita dará como resultado una cadena UCS-2 o UTF-16 si la constante que se convierte no supera la longitud máxima del tipo de datos de cadena nvarchar (4.000). En caso contrario, la conversión implícita generará un valor nvarchar(max) grande.

Advertencia

Cada columna varchar(max) o nvarchar(max) cuyo valor no sea NULL requiere 24 bytes de asignación fija adicional, que se descuentan del límite de 8060 bytes de las filas durante una operación de ordenación. Estos bytes adicionales pueden crear un límite implícito del número de columnas varchar(max) o nvarchar(max) cuyo valor no sea NULL en una tabla. No se produce ningún error especial cuando se crea la tabla (más allá de la advertencia habitual de que el tamaño máximo de la fila supera el máximo permitido de 8060 bytes) ni en el momento de la inserción de los datos. Este gran tamaño de fila puede provocar errores (como el error 512) que los usuarios no puedan prever durante algunas operaciones habituales. Dos ejemplos de operaciones son las actualizaciones de la clave de índice agrupado o las ordenaciones del conjunto de columnas completo.

Conversión de datos de caracteres

Para obtener más información sobre cómo convertir datos de caracteres, consulte char y varchar (Transact-SQL).

Consulte también