Tipo de texto de SQL Server versus tipo de datos varchar [cerrado]

Resuelto George2 asked hace 15 años • 4 respuestas

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

George2 avatar Feb 19 '09 17:02 George2
Aceptado

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

VARCHARsiempre se almacena en fila y tiene un límite de 8000 caracteres. Si intenta crear un VARCHAR(x), donde x > 8000 , obtendrá un error:

Servidor: Mensaje 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 afectan VARCHAR(MAX)a SQL Server 2005 , que puede almacenarse fuera de fila, al igual que TEXT.

Tenga en cuenta que MAXaquí no es un tipo de constante, VARCHARy VARCHAR(MAX)son tipos muy diferentes, siendo este último muy cercano a TEXT.

En versiones anteriores de SQL Server no se podía acceder TEXTdirectamente, solo se podía obtener TEXTPTRy utilizarlo en las funciones READTEXTy WRITETEXT.

En SQL Server 2005 puede acceder directamente TEXTa las columnas (aunque aún necesita una conversión explícita para VARCHARasignarles un valor).

TEXTes bueno:

  • Si necesitas almacenar textos grandes en tu base de datos
  • Si no busca por el valor de la columna
  • Si selecciona esta columna rara vez y no se une a ella.

VARCHARes bueno:

  • Si guardas pequeños hilos
  • Si busca en el valor de la cadena
  • Si siempre lo seleccionas o lo usas en uniones.

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

Al buscar aquí me refiero a realizar cualquier consulta cuyo resultado dependa del valor de la columna TEXTo VARCHAR. Esto incluye su uso en cualquier JOINcondición WHERE.

Como se TEXTalmacena fuera de la fila, las consultas que no involucran la TEXTcolumna suelen ser más rápidas.

Algunos ejemplos de TEXTpara qué es bueno:

  • Comentarios de blogs
  • páginas wiki
  • fuente del código

Algunos ejemplos de VARCHARpara qué es bueno:

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

Como regla general, si alguna vez necesita que el valor del texto exceda los 200 caracteres Y no use unirse en esta columna, use TEXT.

De lo contrario, utilice VARCHAR.

PD: Lo mismo se aplica a UNICODEhabilitado NTEXTy NVARCHARtambién, que debe usar para los ejemplos anteriores.

PPS Lo mismo se aplica a VARCHAR(MAX)y NVARCHAR(MAX)que utiliza SQL Server 2005+TEXT en lugar de y NTEXT. Deberá habilitarlos large value types out of rowsi sp_tableoptiondesea que siempre se almacenen fuera de la fila.

Como se mencionó anteriormente y aquí , TEXTquedará obsoleto en futuras versiones:

La text in rowopción se eliminará en una versión futura de SQL Server . Evite utilizar esta opción en nuevos trabajos de desarrollo y planee modificar las aplicaciones que actualmente utilizan 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 y fuera de la fila de estos tipos de datos, utilice la large value types out of rowopción.

Quassnoi avatar Feb 19 '2009 11:02 Quassnoi

Si utiliza SQL Server 2005 o posterior, utilice varchar(MAX). El texttipo de datos está en desuso y no debe utilizarse para nuevos trabajos de desarrollo. De los documentos :

Importante

ntext, texty imagelos tipos de datos se eliminarán en una versión futura de Microsoft SQL Server. Evite el uso de estos tipos de datos en nuevos trabajos de desarrollo y planee modificar las aplicaciones que actualmente los usan. Utilice nvarchar(max) , varchar(max) y varbinary(max) en su lugar.

Mladen Prajdic avatar Feb 19 '2009 11:02 Mladen Prajdic

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 varchary nvarchar. Entre estas ventajas se encuentra la capacidad de utilizar funciones de manipulación de cadenas como substring().

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

En resumen, nunca utilice Texto, ya que existe una alternativa mejor: (n)varchar(max). Y solo use varchar(max) cuando un varchar normal no sea lo suficientemente grande, es decir, si espera que la cadena que va a almacenar supere los 8000 caracteres.

Como se señaló, puede usar SUBSTRING en el tipo de datos TEXTO, pero solo siempre que los campos de TEXTO contengan menos de 8000 caracteres.

edosoft avatar Feb 19 '2009 11:02 edosoft