Tipo de texto del servidor SQL vs. tipo de datos varchar

Tengo datos de caracteres de longitud variable y deseo almacenarlos en la base de datos de SQL Server (2005). Quiero aprender algunas de las mejores prácticas sobre cómo elegir el tipo de texto TEXT SQL o elegir el tipo de SQL VARCHAR, pros y contras en rendimiento / footprint / función.

Si está utilizando SQL Server 2005 o posterior, use varchar(MAX) . El tipo de datos de text está en desuso y no debe usarse para nuevos trabajos de desarrollo. De los documentos :

Importante

ntext tipos de datos ntext , text e image se eliminarán en una versión futura de Microsoft SQL Server. Evite utilizar estos tipos de datos en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que actualmente los utilizan. Use nvarchar (max) , varchar (max) y varbinary (max) en su lugar.

TEXT se utiliza para grandes piezas de datos de cadena. Si la longitud del campo excede un cierto umbral, el texto se almacena fuera de la fila.

VARCHAR siempre se almacena en fila y tiene un límite de 8000 caracteres. Si intentas crear un VARCHAR(x) , donde x> 8000 , obtienes un error:

Servidor: Msg 131, nivel 15, estado 3, línea 1

El tamaño () dado al tipo ‘varchar’ excede el máximo permitido para cualquier tipo de datos (8000)

Estas limitaciones de longitud no conciernen a VARCHAR(MAX) en SQL Server 2005 , que puede almacenarse fuera de la fila, al igual que TEXT .

Tenga en cuenta que MAX no es un tipo de constante aquí, VARCHAR y VARCHAR(MAX) son tipos muy diferentes, el último está muy cerca de TEXT .

En versiones anteriores de SQL Server no se podía acceder al TEXT directamente, solo se podía obtener un TEXTPTR y usarlo en las funciones READTEXT y WRITETEXT .

En SQL Server 2005 , puede acceder directamente a las columnas de TEXT (aunque aún necesita una VARCHAR explícita a VARCHAR para asignarles un valor).

TEXT es bueno:

  • Si necesita almacenar textos grandes en su base de datos
  • Si no busca en el valor de la columna
  • Si selecciona esta columna raramente y no se une a ella.

VARCHAR es bueno:

  • Si almacena pequeñas cuerdas
  • Si busca en el valor de cadena
  • Si siempre lo selecciona o lo usa en uniones.

Al seleccionar aquí me refiero a emitir cualquier consulta que devuelva el valor de la columna.

Al buscar aquí me refiero a emitir cualquier consulta cuyo resultado dependa del valor de la columna TEXT o VARCHAR . Esto incluye usarlo en cualquier condición JOIN o WHERE .

Como el TEXT se almacena fuera de la fila, las consultas que no incluyen la columna TEXT suelen ser más rápidas.

Algunos ejemplos de lo que TEXT es bueno para:

  • Comentarios del blog
  • Páginas Wiki
  • Fuente de código

Algunos ejemplos de lo que VARCHAR es bueno para:

  • Nombres de usuario
  • Títulos de página
  • Nombres de archivos

Como regla general, si alguna vez necesita que su valor de texto supere los 200 caracteres Y NO use join en esta columna, use TEXT .

De lo contrario, use VARCHAR .

PS Lo mismo se aplica a NTEXT y NVARCHAR habilitados con UNICODE , que debe usar para los ejemplos anteriores.

PPS Lo mismo se aplica a VARCHAR(MAX) y NVARCHAR(MAX) que SQL Server 2005+ usa en lugar de TEXT y NTEXT . Necesitará habilitar large value types out of row para ellos con sp_tableoption si desea que siempre se almacenen fuera de la fila.

Como se mencionó anteriormente y aquí , TEXT va a estar en desuso en futuras versiones:

La opción de text in row se eliminará en una versión futura de SQL Server . Evite utilizar esta opción en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que actualmente usan text in row . Le recomendamos que almacene datos de gran tamaño utilizando los tipos de datos varchar(max) , nvarchar(max) o varbinary(max) . Para controlar el comportamiento dentro de la fila y fuera de la fila de estos tipos de datos, use la opción de large value types out of row .

En SQL Server 2005 se introdujeron nuevos tipos de datos: varchar(max) y nvarchar(max) Tienen las ventajas del antiguo tipo de texto: pueden contener hasta 2 GB de datos, pero también tienen la mayoría de las ventajas de varchar y nvarchar . Entre estas ventajas se encuentran la capacidad de utilizar funciones de manipulación de cadenas como subcadena ().

Además, varchar (max) se almacena en el espacio de la tabla (disco / memoria) mientras el tamaño está por debajo de 8Kb. Solo cuando coloca más datos en el campo, se almacena fuera del espacio de la tabla. Los datos almacenados en el espacio de la tabla (generalmente) se recuperan más rápido.

En resumen, nunca use Text, ya que hay una mejor alternativa: (n) varchar (max). Y solo use varchar (max) cuando un varchar normal no es lo suficientemente grande, es decir, si espera que la cadena que vaya a almacenar excederá los 8000 caracteres.

Como se indicó, puede usar SUBSTRING en el tipo de datos TEXT, pero solo mientras los campos TEXT contengan menos de 8000 caracteres.

Ha habido algunos cambios importantes en ms 2008 -> Puede valer la pena considerar el siguiente artículo al tomar una decisión sobre qué tipo de datos usar. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bytes por

  1. varchar (max), varbinary (max), xml, text o image column 2 ^ 31-1 2 ^ 31-1
  2. columna nvarchar (max) 2 ^ 30-1 2 ^ 30-1