Tipo de texto de SQL Server frente a tipo de datos varchar [cerrado]

287

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

George2
fuente
17
Si Google lo envió aquí: la página Tipos de datos SQL de MSDN puede ayudar.
Jeroen

Respuestas:

212

Si está utilizando SQL Server 2005 o posterior, úselo varchar(MAX). El texttipo de datos está en desuso y no debe usarse 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 usar estos tipos de datos en nuevos trabajos de desarrollo y planee modificar las aplicaciones que los usan actualmente. Utilice nvarchar (max) , varchar (max) y varbinary (max) en su lugar.

Mladen Prajdic
fuente
3
Gracias Mladen, me sorprende ver que TEXT está en desuso. ¿Tienes algún documento oficial que mencione esto?
George2
1
Si bien esto no es "oficial", cubre los conceptos básicos. De hecho, el texto se deprecia y tampoco admite todo lo que hace varchar (max), como la capacidad de buscar e indexar. blog.sqlauthority.com/2007/05/26/…
achinda99
32
esto es tan oficial como parece :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Cool achinda99 y Mladen Prajdic! Lo que proporcionó es lo que estoy buscando. :-) Una pregunta más, ¿cómo elegimos si usar VARCHAR o VARCHAR (MAX) en diferentes situaciones?
George2
1
La información oficial de MS al respecto está en desuso: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTse 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.

VARCHARsiempre se almacena en fila y tiene un límite de 8000 caracteres. Si intenta crear un VARCHAR(x), donde x> 8000 , obtiene 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 MAXno es un tipo de constante aquí, VARCHARy VARCHAR(MAX)son tipos muy diferentes, este último está muy cerca deTEXT .

En versiones anteriores de SQL Server no se podía acceder TEXTdirectamente, solo se podía obtener TEXTPTRy usarlo enREADTEXT y WRITETEXTfunciones.

En SQL Server 2005 puede acceder directamente a las TEXTcolumnas (aunque aún necesita una conversión explícita paraVARCHAR 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 guardas cuerdas pequeñas
  • Si busca en el valor de la 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 TEXTo VARCHAR. Esto incluye usarlo en cualquier JOINo WHEREcondición.

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

Algunos ejemplos de lo que TEXTes bueno para:

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

Algunos ejemplos de lo que VARCHARes bueno para:

  • Nombres de usuario
  • Títulos de la página
  • Nombres de archivo

Como regla general, si alguna vez necesita que el valor del texto supere los 200 caracteres Y no use la combinación en esta columna, useTEXT .

De lo contrario uso 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 SQL Server 2005+ usa en lugar de TEXTy NTEXT. Usted será necesario que habilite large value types out of rowpara ellos con sp_tableoptionsi usted quiere que ellos sean siempre guardados fuera de la fila.

Como se mencionó anteriormente y aquí , TEXTserá desaprobado en futuras versiones:

La text in rowopción se eliminará en una versión futura de SQL Server . Evite usar esta opción en nuevos trabajos de desarrollo y planee modificar las aplicaciones que usa actualmente text in row. Nos recomienda almacenar grandes cantidades de datos mediante el uso de los varchar(max), nvarchar(max)o varbinary(max)tipos de datos. Para controlar el comportamiento en fila y fuera de fila de estos tipos de datos, use la large value types out of rowopción

Quassnoi
fuente
2
1. "Si no busca en el valor de la columna", ¿podría mostrarme qué quiere decir "buscar"? ¿Quiere decir seleccionar esta columna, ordenar esta columna, ME GUSTA esta columna o usar alguna función de manipulación de cadenas en esta columna?
George2
2
2. "VARCHAR siempre se almacena en fila y tiene un límite de 8000 caracteres". - Lo siento, no estoy de acuerdo contigo. VARCHAR podría ser más largo que 8000 y si es más largo que 8000, VARCHAR se almacenará en otras columnas. ¿Algún comentario?
George2
1
3. Mladen Prajdic mencionó en este hilo, el tipo de TEXTO está en desuso, pero no encuentro ningún documento que lo cubra. ¿Tienes algún documento que cubra esto?
George2
2
Genial Quassnoi! ¡Eres tan conocedor! :-) Una pregunta más: "Esto, por supuesto, no concierne a VARCHAR (MAX), que es como SQL SERVER 2005, sinónimo de TEXTO". "Esto" quieres decir qué?
George2
"Esto, por supuesto, no concierne a VARCHAR (MAX), que es como SQL SERVER 2005 un sinónimo de TEXTO". - ¿tiene algún documento que diga que TEXT es lo mismo que VARCHAR en SQL Server 2005? Hice una búsqueda pero no puedo encontrar documentos oficiales. :-)
George2
41

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 op a 2 GB de datos, pero también tienen la mayoría de las ventajas de varchary nvarchar. Entre estas ventajas están la capacidad de usar funciones de manipulación de cadenas como substring ().

Además, varchar (max) se almacena en el espacio de la tabla (disco / memoria) mientras que el tamaño es inferior a 8Kb. 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 (generalmente) se recuperan más rápido.

En resumen, nunca use Text, ya que existe una mejor alternativa: (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 TEXT, pero solo mientras los campos TEXT contengan menos de 8000 caracteres.

edosoft
fuente
1
Gracias Edoode, respondiste bastante bien lo bueno que es VARCHAR, pero ¿tienes algún comentario o idea sobre cuándo usar VARCHAR y cuándo usar TEXT? Mi pregunta es sobre elegir 1 de 2 tema. :-)
George2
1
En realidad, en MS SQL Server 2005 puede usar SUBSTRING y otras funciones también en columnas TEXT.
Quassnoi
1
Gracias Quassnoi! Parece que TEXT está en desuso. Una pregunta más, ¿cómo elegimos si usar VARCHAR o VARCHAR (MAX) en diferentes situaciones?
George2
1
Solo use varchar (max) cuando un varchar normal no sea lo suficientemente grande (8Kb debería ser suficiente para todos;)
edosoft
7

Ha habido algunos cambios importantes en ms 2008 -> Podría 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, texto o columna de imagen 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (máx.) columna 2 ^ 30-1 2 ^ 30-1
Draz
fuente
3
Cambios? Estas capacidades no han cambiado desde que se introdujeron los nuevos tipos de datos.
Martin Smith