Tipo de texto de SQL Server vs. tipo de datos varchar [cerrado]


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

Author: Brian Webster, 2009-02-19

4 answers

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

Importante

ntext , text, y image tipos de datos se quitará en una versión futura de Microsoft SQL Server. Evite usar estos tipos de datos en nuevos trabajos de desarrollo y planifique modificar las aplicaciones que los utilizan actualmente. Use nvarchar(max), varchar(max), y varbinary(max) en su lugar.

 184
Author: Mladen Prajdic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-23 14:41:50

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

VARCHAR siempre se almacena en fila y tiene un límite de 8000 personajes. Si intenta crear un VARCHAR(x), donde x > 8000 , obtendrá 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 afectan 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, este último siendo muy cercano a TEXT.

En versiones anteriores de SQL Server no se podía acceder a 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 TEXT (aunque todavía necesita un cast explícito 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 cadenas
  • Si busca en el valor de cadena
  • Si seleccione siempre, ni en las combinaciones.

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

Por buscando aquí me refiero a emitir cualquier consulta cuyo resultado depende 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 involucran la columna TEXT suelen ser más rápidas.

Algunos ejemplos de lo que TEXT es bueno para:

  • Blog comentarios
  • Páginas wiki
  • Código fuente

Algunos ejemplos de lo que VARCHAR es bueno para:

  • Nombres de usuario
  • Títulos de las páginas
  • Nombres de archivo

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

De lo contrario use VARCHAR.

P.d. Lo mismo se aplica a UNICODE habilitado NTEXT y NVARCHAR también, que debe usar para ejemplos anteriores.

P. P. S. lo mismo se aplica a VARCHAR(MAX) y NVARCHAR(MAX) que SQL Server 2005+ utiliza 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 ser obsoleto en futuras versiones:

La opción text in row se eliminará en el futuro versión de SQL Server . Evite usar esta opción en nuevos trabajos de desarrollo, y planee modificar las aplicaciones que actualmente usan text in row. Le recomendamos que almacene grandes datos utilizando el varchar(max), nvarchar(max), o varbinary(max) tipos de datos. Para controlar el comportamiento dentro y fuera de la fila de estos tipos de datos, utilice la opción large value types out of row.

 269
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 19:41:32

En SQL server 2005 se introdujeron nuevos tipos de datos: varchar(max) y nvarchar(max) Tienen las ventajas del tipo de texto antiguo: pueden contener op a 2 GB de datos, pero también tienen la mayoría de las ventajas de varchar y nvarchar. Entre estas ventajas está 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 el tamaño está por debajo de 8Kb. Solo cuando coloca más datos en el campo, se almacenan fuera de la tabla espacio. Los datos almacenados en el espacio de la tabla se recuperan (generalmente) más rápido.

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

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

 37
Author: edosoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-22 13:31:37

Ha habido algunos cambios importantes en ms 2008 -> Podría valer la pena considerar el siguiente artículo al tomar decisiones 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 imagen columna 2^31-1 2^31-1
  2. nvarchar (max) columna 2^30-1 2^30-1
 6
Author: Draz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-25 15:14:19