type nchar data sql-server nvarchar

sql-server - sql server nchar data type



¿VARCHAR es totalmente 1990? (14)

  1. VARCHAR no almacena caracteres Unicode.
  2. NVARCHAR almacena los caracteres Unicode.
  3. Las aplicaciones de hoy siempre deben ser compatibles con Unicode.
  4. NVARCHAR toma el doble de espacio para almacenarlo.
  5. El punto 4 no importa porque el espacio de almacenamiento es extremadamente económico.

Ergo: Al diseñar las bases de datos de SQL Server hoy, siempre se debe usar NVARCHAR.

¿Es esto un buen razonamiento? ¿Alguien está en desacuerdo con alguna de las premisas? ¿Hay alguna razón para elegir VARCHAR sobre NVARCHAR hoy?


El punto 4 no importa porque el espacio de almacenamiento es extremadamente económico.

no es solo almacenamiento, sino ancho de banda: CPU, memoria, copia de seguridad, recuperación, transferencia. Conservar.


¿Hay alguna manera para que su servidor de base de datos use UTF-8 como una codificación? A continuación, obtiene los beneficios del bajo almacenamiento para la mayoría de las cargas ASCII y la capacidad de almacenar cualquier cosa en el rango de Unicode para que la expansión sea posible.

También le pediría a su proveedor de base de datos que admita UTF-8 como una codificación para el tipo VARCHAR SQL. No sé cómo lo hacen otros servidores de bases de datos, pero sé que puede usar UTF-8 en los campos VARCHAR y TEXT en al menos MySQL y PostgreSQL.

Sin embargo, dicho todo esto, la única razón para no usar un campo codificado UTF-16 es si tiene que interactuar con aplicaciones que se rompen en la entrada UTF-16. Esta sería la mayoría de las aplicaciones heredadas que fueron diseñadas para manejar codificaciones de texto ASCII o ISO-8815, lo cual sería mejor para el procesamiento de UTF-8.


Combina el tipo de datos con los datos que se almacenarán en la columna. Mediante un argumento similar, podría decir por qué no almacenar todos los datos en columnas NVARCHAR, porque los números y las fechas se pueden representar como cadenas de dígitos.

Si la mejor coincidencia para los datos que se almacenarán en la columna es VARCHAR, utilícela.


Como otros han señalado, no es solo el costo del almacenamiento.

La longitud de una columna afectará la cantidad de filas por página. Tener menos filas por página significa que menos pueden caber en sus cachés, lo que reduce el rendimiento. Supongo que en MSSQL, una columna NVARCHAR indexada consumirá más espacio en el índice. Lo que significa menos entradas de índice por bloque, por lo tanto, más bloques en el índice, por lo tanto, más busca al escanear (o buscar) índices, lo que ralentiza también el acceso indexado.

Por lo tanto, pierde rendimiento en todos los frentes. Si realmente no te importa (o puedes medir el rendimiento y estás contento con él, por supuesto), está bien. Pero si tiene un requisito genuino para almacenar caracteres Unicode, por supuesto, use NVARCHAR.

Puede ser que la facilidad de mantenimiento obtenida mediante el uso de NVARCHAR en toda su base de datos supere cualquier costo de rendimiento.


Creo que la comparación de nvarchars es más costosa que varchar, por lo que es perfectamente válida e incluso preferida en lugares donde realmente no se necesitan capacidades Unicode, es decir, para algunos ID internos.

Y el costo de almacenamiento aún importa . Si tienes miles de millones de filas, esas diferencias "pequeñas" se hacen bastante grandes.


El almacenamiento es menos costoso de lo que ha sido históricamente, pero aún así, si puedes almacenar el doble de datos en un disco duro determinado, eso es atractivo, ¿no?

También hay memoria RAM para el almacenamiento en caché y unidades de estado sólido, que son mucho más caras que las unidades de disco duro. Es beneficioso usar formatos de datos más compactos cuando tienes millones de filas.


No soy un experto en el tema. ¿Pero alguna razón por la cual no podría usar UTF-8 para obtener una combinación de espacio pequeño y unicode?


Tu punto 3 no es válido. Los sistemas que están diseñados solo para el uso de un solo país no tienen que preocuparse por el Unicode, y algunos idiomas / productos en uso no son compatibles con Unicode en absoluto o solo parcialmente. Por ejemplo, TurboTax es solo para EE. UU. (E incluso con una versión canadiense con francés sigue siendo LATIN-1), por lo que no necesitarían ni tendrían que preocuparse por Unicode y probablemente no lo admitan (no lo hago). saber si lo hacen o no, pero incluso si lo hacen, es solo un ejemplo).

"Las aplicaciones de hoy siempre deben ser compatibles con Unicode".

es probablemente más válido expresado como:

"Las aplicaciones de hoy en día siempre deben ser compatibles con Unicode si no es necesario que ocurra nada especial para manejar Unicode adecuadamente, y una base de código previamente existente o cualquier otra parte de la aplicación no necesita actualizarse específicamente para soportarlo".


Debería elegir VARCHAR sobre NVARCHAR para muchos tipos diferentes de columnas, y la elección sería por columna.

Las columnas típicas que no requerirían la sobrecarga adicional en la que NVARCHAR incurriría serían:

Columnas de tipo ID: matrículas, números de seguro social, identificadores de diagramas de pacientes, etc.

Columnas de código: códigos de moneda internacional (USD, UKP, etc.), códigos de país ISO (EE. UU., Reino Unido, etc.), códigos de idioma (en-us, etc.), códigos de segmento contable, etc.

Código postal y columnas de código postal.


Diría que todavía hay razones válidas para no usar nvarchar.

  • El espacio de almacenamiento es un bien escaso, como en un host compartido o la base de datos es realmente enorme.
  • El rendimiento es crítico.
  • Desarrollo de Brownfield (es decir, la base de datos tiene tablas existentes que usan varchar).
  • Se está integrando con otro sistema anterior que solo comprende caracteres de un solo byte y / o varchar.

Sin embargo, un nuevo desarrollo probablemente debería usar nvarchar esp. ya que los sistemas de 64 bits se están convirtiendo en la norma. Además, las compañías (incluso las pequeñas) ahora son más comúnmente globales.


He visto alguna base de datos donde los índices (¿índices? ... debate diferente) han sido más grandes que los datos. Si uno puede salirse con la mitad de las demandas de almacenamiento (varchar) dentro del índice, se supone que equivale al doble de la densidad de aciertos de una página dada y factor de relleno más eficiente que lleva a una recuperación de datos / escritura / bloqueo más rápida y menos requisitos de almacenamiento ( ya mencionado).


Mi inclinación es "usar NVARCHAR" como valor por defecto ... pero @CadeRoux tiene un buen punto: si está SEGURO de que los datos nunca tendrán nada más que ASCII, como una placa estadounidense, VARCHAR podría ahorrarle un poquito de costo.

Yo diría que la otra cara de su declaración bien puesta es "DO use NVARCHAR" para cualquier cosa que tenga nombres (personas, calles, lugares) o texto en lenguaje natural (correo electrónico, chat, artículos, publicaciones en blogs, leyendas de fotos). De lo contrario, su columna "firstname" no podrá codificar "François" o "José" correctamente, y sus columnas de texto no permitirán el texto con signos diacríticos "extranjeros", o - para el caso - caracteres estadounidenses muy comunes como céntimo "¢", párrafo marca "¶", viñeta "•". (Debido a que ninguno de estos son caracteres ASCII , y no hay una forma buena y estándar de ponerlos en un campo VARCHAR. Confía en mí: te lastimarás).

En CUALQUIER proyecto en el que he trabajado, NUNCA me han regañado por usar NVARCHAR porque estaba "desperdiciando demasiado dinero de la compañía en espacio en el disco". Y si tuviera que volver a trabajar con el código o el esquema DB (especialmente en un sistema de producción en vivo), el costo gastado en el reajuste superaría FÁCILMENTE los "ahorros" de comprar un disco que era un 50% más pequeño.

Para entender realmente esta pregunta, realmente debes entender las codificaciones típicas de ASCII, Unicode y Unicode (como UCS-2 y UTF-8).


Este tipo de preguntas siempre tienen la misma respuesta: depende . No hay una regla mágica que debes seguir ciegamente. Incluso el uso de GOTO en los lenguajes de programación modernos puede justificarse: ¿es alguna vez ventajoso usar ''goto'' en un lenguaje que admita bucles y funciones? Si es así, ¿por qué?

Entonces la respuesta es: usa tu cabeza y piensa en la situación particular. En esta instancia particular, tenga en cuenta que siempre puede convertir de varchar a nvarchar en la base de datos si resulta que cambian sus requisitos.


He visto columnas nvarchar convertidas a varchar por dos razones:

  1. La aplicación está utilizando MSSQL Express Edition , que tiene un límite de tamaño de la base de datos de 4GB. El cambio a MSSQL Standard Edition sería demasiado costoso si hay muchas implementaciones de bases de datos, como en aplicaciones de usuario único o aplicaciones con DBMS incorporado. El SQL2008 Web Edition más barato podría ayudar aquí.

  2. nvarchar (4000) no es suficiente, pero no desea una columna ntext. Entonces usted convierte a varchar (8000). Sin embargo, en la mayoría de los casos, probablemente deba convertir a nvarchar (max).