2009-02-16 12 views
6

Estoy diseñando un esquema de base de datos en este momento y me imagino que para estar seguro debería usar nvarchar para los tipos de datos de mi columna textual (para compatibilidad con Unicode). Aunque no espero texto en inglés, creo que sería mejor tener soporte desde el principio por las dudas.¿Existe alguna razón por la que no deba usar NVARCHAR en el servidor Sql?

¿Hay alguna razón por la que deba seguir con el varchar simple? ¿Actuación?

+0

Agregaría la versión de SQL Server a su pregunta, ¿puede hacer una diferencia? – Ash

+0

Actualmente estoy usando el servidor sql 2005, pero estamos buscando pasar al 2008 con el tiempo. – mmcdole

Respuesta

1

Sí, el rendimiento, en el tamaño. nvarchar toma más bytes, creo que es doble (corrígeme si estoy equivocado) y esto se debe al soporte Unicode. Entonces, si no necesita soporte Unicode, vaya con varchar regular.

+0

Aunque no estoy seguro de qué codificación Unicode usan en el SQL Server, puede ser variable. Es decir, un carácter en Unicode puede tener entre 1 y 4 bytes en algunas codificaciones. – mmcdole

+0

SQL Server está arreglado UTF-16 –

+0

@Marc Gravell, gotchya. – mmcdole

11

En el mundo i18n de hoy, nvarchar tiene mucho sentido. varchar puede tener sentido para los datos que son especificados para no ser unicode (tal vez tenga algunos campos del sistema que se exige sean ASCII).

que haría uso de nvarchar por defecto para cosas como nombres, descripciones, direcciones, etc.

varchar es menor, por lo que no son, quizás, algunos ahorros IO con varchar sobre nvarchar (pero tenga en cuenta que la página de códigos se convierte en una mayor problema también).

4

Además, ver a esta pregunta: VARCHAR vs NVARCHAR performance.

En lo personal, yo digo se adhieren a varchar (mientras respondía en este hilo). Hay una sobrecarga de rendimiento no trivial.

1

Usamos VARCHAR para casi todo, y NVARCHAR solo muy muy ocasionalmente.

códigos de producto no necesitan NVarchar - no permitimos que no sea AZ, 0-9 y nada "_" en ellos ...

Su doble de espacio de almacenamiento, pero también sólo tienen la mitad de la las entradas por página de índice (y por página de datos) y la mitad de la memoria caché se "desperdicia", más ciclos de CPU para comparar datos, y más.

IME los acentos extranjeros comúnmente utilizados funcionan justo en Varchar (es decir, LATIN-1). No tenemos planes de hacer juegos de caracteres chinos u otros juegos de caracteres alternativos, y cuando podamos manejar ese conjunto de caracteres utilizando NVarchar desde el primer día será la menor de nuestras preocupaciones: ¿alineación de texto de derecha a izquierda o vertical? :(

Y si permitió NVarchar para, por ejemplo, un nombre, ¿cómo va a escribir el carácter extendido desde su teclado? Y si importa los datos (por lo que ya es NVarchar) cómo va a ser capaz de buscar a ese cliente usando su teclado QWERTY estándar. Muchos y muchos involucrados con la internacionalización de una aplicación, así que mi punto de vista es que no tiene sentido "permitirlo usando NVarchar".

Pero de nuevo hay muchos lugares donde vaya a tener NVarchar ... y la mayoría de las columnas tienen 50 caracteres de ancho también ... ¡deben saber algo sobre el crecimiento de la población y los planes de expansión para los códigos postales que yo no tengo!

1

Como se mencionó anteriormente, la compensación es a prueba de futuro frente al rendimiento. En mi experiencia, SQL Server funciona bastante bien con menores limitaciones de CPU y memoria, pero le da una E/S de disco lenta y realmente puede funcionar.

Si no tiene planes para juegos de caracteres de doble byte (es decir, caracteres chinos), quédese con VARCHAR (MAX).

0

En términos generales; Comience con el tipo de datos más caro que tenga las menores restricciones. Ponlo en producción. Si el rendimiento comienza a ser un problema, averigüe qué se está almacenando realmente en esas columnas nvarchar. ¿Hay algún personaje que no encaje en varchar? Si no, cambie a varchar. No intente preoptimizar antes de saber dónde está el dolor. Supongo que la elección entre nvarchar/varchar no es lo que va a ralentizar su aplicación en el futuro previsible. Habrá otras partes de la aplicación donde la optimización del rendimiento le dará mucho más dinero por los dólares.

Cuestiones relacionadas