post icon

[TSQL] NVARCHAR vs VARCHAR

Esta es una pregunta muy común entre los que comienzan a utilizar el motor de Microsoft, y no por ello trivial. A muchos le parece trivial, pero en base de datos medianas y grandes puede tener un impacto fuertemente negativo si no se lo utiliza correctamente.

Lo común entre ambos es que son de longitud variable, definidas siempre por un tope máximo.

VARCHAR: es la abreviatura de VARIABLE-LENGTH CHARACTER STRING, su equivalente ISO es char varying o character varying. Este tipo almacena caracteres ASCII EXTENDIDO de 1 byte, por lo tanto puede almacenar hasta 8000 caracteres
, si no se especifica como VARCHAR(MAX) que puede almacenar hasta 2 GB.

NVARCHAR: es la abreviatura de UNICODE VARIABLE-LENGTH CHARACTER STRING, su equivalente ISO es national char varying y national character varying. Este tipo almacena caracteres UNICODE de 2 byte, por lo tanto puede almacenar hasta 4000 caracteres, si no se especifica como VARCHAR(MAX) que puede almacenar hasta 2 GB.

Para ambos casos el máximo por defecto es de 30 si no se especifica.

Si bien VARCHAR  tiene una capacidad mayor de almacenar caracteres, puede almacenar caracteres limitados por utilizar ASCII que no soporta caracteres universales.

Les recomiendo utilizar siempre NVARCHAR por su compatibilidad con caracteres, idiomas y codificación especiales, especialmente si trabajaran con paginas webs.

Si bien ambos pueden almacenar una cantidad grande de caracteres, no todo es color de rosa si se desea utilizar índices sobre estos campos. En SQL Server, los indices tienen un límite de 900 bytes. ¿Cómo impacta esto en el diseño? Pues significa que solo pueden indizarse campos que tengan como máximo una longitud de 900 bytes, lo que equivale a VARCHAR(900) y NVARCHAR(450). Si se necesita indizar un campo con mayor longitud, se necesita necesariamente SQL Server 2008 en adelante y agregar un índice de Texto Completo, que no es lo mismo, y lo veremos más adelante.

También se debe tener en cuenta que las conversiones entre ambos tipos son bastante lentas, por ello deben cuidar su mezcla, solo deben hacerlo si es realmente necesario.

Desde las aplicaciones que construimos también tenemos que tener algunas consideraciones para estos tipos y otros, pero prefiero hablar de ello en un post especifico para el caso.

Comentarios desde Facebook:

  1. avatar
    christian ramirez PERU Internet Explorer Windows
    27 agosto 2014 at 15:09 #

    Exelente post, gracias

Trackbacks/Pingbacks

  1. Parameters.Add vs Parameters.AddWithValue | DevTroce.com UNITED STATES WordPress - 19 marzo 2013

    […] escribía el post sobre las diferencias entre NVARCHAR y VARCHA de SQL Server hacía mención sobre el rendimiento que pueden tener  los tipos de datos y el envío […]

Responder