tipos length datos data sql-server varchar nvarchar

sql server - length - ¿Cuál es la diferencia entre varchar y nvarchar?



tipos de datos sql server (18)

¿Es solo que nvarchar soporta caracteres multibyte? Si ese es el caso, ¿existe realmente algún punto, aparte de los problemas de almacenamiento, para usar varchars ?



Aunque NVARCHAR almacena Unicode, debe considerar que con la ayuda de la intercalación también puede usar VARCHAR y guardar sus datos de sus idiomas locales.

Solo imagina el siguiente escenario.

La compilación de su base de datos es persa y guarda un valor como ''علی'' (escritura persa de Ali) en el tipo de datos VARCHAR(10) . No hay problema y el DBMS solo usa tres bytes para almacenarlo.

Sin embargo, si desea transferir sus datos a otra base de datos y ver el resultado correcto, su base de datos de destino debe tener la misma intercalación que el objetivo que es persa en este ejemplo.

Si su clasificación de destino es diferente, verá algunos signos de interrogación (?) En la base de datos de destino.

Finalmente, recuerde que si está utilizando una base de datos enorme para el uso de su idioma local, le recomendaría usar la ubicación en lugar de usar demasiados espacios.

Creo que el diseño puede ser diferente. Depende del entorno en el que trabajes.


Depende de cómo se instaló Oracle. Durante el proceso de instalación, se establece la opción NLS_CHARACTERSET. Es posible que lo encuentre con el SELECT value$ FROM sys.props$ WHERE name = ''NLS_CHARACTERSET'' la consulta SELECT value$ FROM sys.props$ WHERE name = ''NLS_CHARACTERSET'' .

Si su NLS_CHARACTERSET es una codificación Unicode como UTF8, genial. Usar VARCHAR y NVARCHAR son prácticamente idénticos. Deja de leer ahora, solo ve por ello. De lo contrario, o si no tiene control sobre el conjunto de caracteres de Oracle, siga leyendo.

VARCHAR: los datos se almacenan en la codificación NLS_CHARACTERSET. Si hay otras instancias de base de datos en el mismo servidor, es posible que esté restringido por ellas; y viceversa, ya que hay que compartir la configuración. Dicho campo puede almacenar cualquier información que pueda codificarse utilizando ese conjunto de caracteres, y nada más . Por ejemplo, si el conjunto de caracteres es MS-1252, solo puede almacenar caracteres como letras en inglés, un puñado de letras con acento y otras (como € y -). Su aplicación sería útil solo para algunos entornos locales, incapaz de operar en cualquier otro lugar del mundo. Por esta razón, se considera una mala idea.

NVARCHAR: los datos se almacenan en una codificación Unicode. Todos los idiomas son compatibles. Una buena idea.

¿Qué pasa con el espacio de almacenamiento? VARCHAR es generalmente eficiente, ya que el conjunto de caracteres / codificación fue diseñado de forma personalizada para una configuración regional específica. Los campos NVARCHAR se almacenan en codificación UTF-8 o UTF-16, basándose en la configuración de NLS de forma irónica. UTF-8 es muy eficiente para los idiomas "occidentales", al mismo tiempo que admite idiomas asiáticos. UTF-16 es muy eficiente para los idiomas asiáticos, a la vez que admite los idiomas "occidentales". Si le preocupa el espacio de almacenamiento, elija una configuración NLS para hacer que Oracle use UTF-8 o UTF-16 según corresponda.

¿Qué pasa con la velocidad de procesamiento? La mayoría de las nuevas plataformas de codificación utilizan Unicode de forma nativa (Java, .NET, ¡incluso C ++ std :: wstring de hace años!) Por lo que si el campo de la base de datos es VARCHAR, obliga a Oracle a convertir entre conjuntos de caracteres en cada lectura o escritura, no tan bueno. El uso de NVARCHAR evita la conversión.

En pocas palabras: utilizar NVARCHAR! Evita las limitaciones y dependencias, está bien para el espacio de almacenamiento y, por lo general, también lo es para el rendimiento.


Eché un vistazo a las respuestas y muchos parecen recomendar el uso de nvarchar sobre varchar , ya que el espacio ya no es un problema, por lo que no hay ningún problema en habilitar Unicode para un poco de almacenamiento adicional. Bueno, esto no siempre es cierto cuando desea aplicar un índice sobre su columna. SQL Server tiene un límite de 900 bytes en el tamaño del campo que puede indexar. Entonces, si tiene un varchar(900) todavía puede indexarlo, pero no varchar(901) . Con nvarchar , la cantidad de caracteres se reduce a la mitad, por lo que puede indexar hasta nvarchar(450) . Entonces, si está seguro de que no necesita nvarchar , no recomiendo usarlo.

En general, en las bases de datos, recomiendo mantener el tamaño que necesita, porque siempre puede ampliar. Por ejemplo, un colega en el trabajo una vez pensó que no hay ningún daño en el uso de nvarchar(max) para una columna, ya que no tenemos ningún problema con el almacenamiento. Más adelante, cuando intentamos aplicar un índice sobre esta columna, SQL Server rechazó esto. Sin embargo, si comenzó con incluso varchar(5) , podríamos haberlo expandido más tarde a lo que necesitamos sin un problema que requiera que hagamos un plan de migración de campo para solucionar este problema.


La principal diferencia entre Varchar(n) y nvarchar(n) es:

Varchar tamaño de Varchar (datos de caracteres de longitud variable, no Unicode) es de hasta 8000. 1. Es un tipo de datos de longitud variable

  1. Se utiliza para almacenar caracteres no Unicode

  2. Ocupa 1 byte de espacio para cada personaje.

Nvarchar : datos de caracteres Unicode de longitud variable.

1. Es un tipo de datos de longitud variable.

2.Utilizado para almacenar caracteres Unicode.

  1. Los datos se almacenan en una codificación Unicode. Todos los idiomas son compatibles. (por ejemplo, los idiomas árabe, alemán, hindi, etc., etc.)

Mis dos centavos

  1. Los índices pueden fallar cuando no se usan los tipos de datos correctos:
    En SQL Server: cuando tiene un índice sobre una columna VARCHAR y lo presenta como una cadena Unicode, SQL Server no hace uso del índice. Lo mismo sucede cuando presenta un BigInt a una columna indexada que contiene SmallInt. Incluso si BigInt es lo suficientemente pequeño como para ser un SmallInt, SQL Server no puede usar el índice. Al revés, no tiene este problema (al proporcionar SmallInt o Ansi-Code a una columna indexada de BigInt o NVARCHAR).

  2. Los tipos de datos pueden variar entre diferentes DBMS (Sistema de gestión de bases de datos):
    Sepa que cada base de datos tiene tipos de datos ligeramente diferentes y VARCHAR no significa lo mismo en todas partes. Si bien SQL Server tiene VARCHAR y NVARCHAR, una base de datos de Apache / Derby solo tiene VARCHAR y VARCHAR está en Unicode.


Principalmente nvarchar almacena caracteres Unicode y varchar almacena caracteres no Unicode.

"Unicodes" significa un esquema de codificación de caracteres de 16 bits que permite que los caracteres de muchos otros idiomas como el árabe, hebreo, chino, japonés, se codifiquen en un solo conjunto de caracteres.

Eso significa que Unicodes está usando 2 bytes por carácter para almacenar y Nonunicodes usa solo un byte por carácter para almacenar. Lo que significa que los Unicodes necesitan una doble capacidad de almacenamiento en comparación con los no Unicodes.


Si se utiliza un solo byte para almacenar un carácter, hay 256 combinaciones posibles y, por lo tanto, puede guardar 256 caracteres diferentes. La intercalación es el patrón que define los caracteres y las reglas por las que se comparan y ordenan.

1252, que es el Latin1 (ANSI), es el más común. Los conjuntos de caracteres de un solo byte también son inadecuados para almacenar todos los caracteres utilizados por muchos idiomas. Por ejemplo, algunos idiomas asiáticos tienen miles de caracteres, por lo que deben usar dos bytes por carácter.

Unicode standard

Cuando los sistemas que utilizan varias páginas de códigos se utilizan en una red, resulta difícil gestionar la comunicación. Para estandarizar las cosas, el consorcio ISO y Unicode introdujeron el Unicode . Unicode utiliza dos bytes para almacenar cada carácter. Es decir, se pueden definir 65,536 caracteres diferentes, por lo que casi todos los caracteres se pueden cubrir con Unicode. Si dos computadoras usan Unicode, todos los símbolos se representarán de la misma manera y no se necesita conversión, esta es la idea detrás de Unicode.

SQL Server tiene dos categorías de tipos de datos de caracteres:

  • no Unicode (char, varchar y texto)
  • Unicode (nchar, nvarchar y ntext)

Si necesitamos guardar datos de caracteres de varios países, utilice siempre Unicode.


Siempre uso nvarchar, ya que permite que cualquier cosa que esté construyendo resista casi cualquier dato que le ofrezco. Mi sistema CMS hace chino por accidente, porque usé nvarchar. En estos días, cualquier aplicación nueva no debería preocuparse por la cantidad de espacio requerido.



Tengo que decir aquí (¡me doy cuenta de que probablemente me abriré a una trampa!), Pero seguramente la única vez que NVARCHAR sea ​​en realidad más útil (¡noten más allí!) Que VARCHAR es cuando todas las colaciones en todos los sistemas dependientes y dentro de la base de datos son los mismos ...? De lo contrario, la conversión de intercalación debe realizarse de todos modos, por lo que VARCHAR es tan viable como NVARCHAR .

Para agregar a esto, algunos sistemas de bases de datos, como SQL Server (antes de 2012) tienen un tamaño de página de aprox. 8K. Por lo tanto, si está buscando almacenar datos de búsqueda que no se encuentran en algo como un campo de TEXT o NTEXT , VARCHAR proporciona el espacio completo de 8k, mientras que NVARCHAR solo proporciona 4k (doble de bytes, doble de espacio).

Supongo que, para resumir, el uso de cualquiera depende de:

  • Proyecto o contexto
  • Infraestructura
  • Sistema de bases de datos

Tienes razón. nvarchar almacena datos Unicode mientras que varchar almacena datos de caracteres de un solo byte. Aparte de las diferencias de almacenamiento ( nvarchar requiere el doble de espacio de almacenamiento que varchar ), como ya mencionó, la principal razón para preferir nvarchar sobre varchar sería la internacionalización (es decir, almacenar cadenas en otros idiomas).


Una columna nvarchar puede almacenar cualquier dato Unicode. Una columna varchar está restringida a una página de códigos de 8 bits. Algunas personas piensan que se debe usar varchar porque ocupa menos espacio. Creo que esta no es la respuesta correcta. Las incompatibilidades de la página de códigos son un dolor, y Unicode es la cura para los problemas de la página de códigos. Hoy en día, con el disco y la memoria baratos, realmente no hay razón para perder tiempo buscando páginas de códigos.

Todos los sistemas operativos modernos y plataformas de desarrollo utilizan Unicode internamente. Al utilizar nvarchar lugar de varchar , puede evitar realizar conversiones de codificación cada vez que lea o escriba en la base de datos. Las conversiones toman tiempo y son propensas a errores. Y la recuperación de los errores de conversión es un problema no trivial.

Si está interactuando con una aplicación que usa solo ASCII, todavía recomendaría usar Unicode en la base de datos. Los algoritmos de intercalación de la base de datos y el sistema operativo funcionarán mejor con Unicode. Unicode evita problemas de conversión al interactuar con otros sistemas. Y te estarás preparando para el futuro. Y siempre puede validar que sus datos están restringidos a ASCII de 7 bits para cualquier sistema heredado que tenga que mantener, incluso mientras disfruta de algunos de los beneficios del almacenamiento Unicode completo.


Yo diría, depende.

Si desarrolla una aplicación de escritorio, donde el sistema operativo funciona en Unicode (como todos los sistemas Windows actuales) y el idioma es compatible de forma nativa con Unicode (las cadenas predeterminadas son Unicode, como en Java o C #), entonces vaya a nvarchar.

Si desarrolla una aplicación web, donde las cadenas vienen como UTF-8, y el lenguaje es PHP, que aún no admite Unicode de forma nativa (en las versiones 5.x), entonces varchar probablemente será una mejor opción.


nVarchar te ayudará a almacenar caracteres Unicode. Es el camino a seguir si desea almacenar datos localizados.


nvarchar almacena datos como Unicode, por lo tanto, si va a almacenar datos multilingües (más de un idioma) en una columna de datos, necesita la variante N.


varchar : datos de caracteres de longitud variable que no son Unicode. La recopilación de la base de datos determina en qué página de códigos se almacenan los datos.

nvarchar : datos de caracteres Unicode de longitud variable. Depende de la base de datos para comparaciones.

Con este conocimiento, utilice el que coincida con sus datos de entrada (ASCII v. Unicode).


nvarchar es seguro de usar en comparación con varchar para hacer que nuestro código sea libre de errores (falta de coincidencia de tipo) porque nvarchar permite caracteres Unicode. Cuando usamos la condición where en la consulta de SQL Server y si estamos usando el operador = , se producirá un error algunas veces. La razón probable de esto es que nuestra columna de mapeo estará definida en varchar . Si lo definimos en nvarchar este problema no pasará. Aún así, seguimos con varchar y evitamos este problema, es mejor que utilicemos la palabra clave LIKE en lugar de = .