Tipo de texto de SQL Server versus tipo de datos varchar [cerrado]
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.
TEXT
se 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.
VARCHAR
siempre 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 MAX
aquí no es un tipo de constante, VARCHAR
y VARCHAR(MAX)
son tipos muy diferentes, siendo este último muy cercano a TEXT
.
En versiones anteriores de SQL Server no se podía acceder TEXT
directamente, solo se podía obtener TEXTPTR
y utilizarlo en las funciones READTEXT
y WRITETEXT
.
En SQL Server 2005 puede acceder directamente TEXT
a las columnas (aunque aún necesita una conversión explícita para VARCHAR
asignarles un valor).
TEXT
es 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.
VARCHAR
es 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 TEXT
o VARCHAR
. Esto incluye su uso en cualquier JOIN
condición WHERE
.
Como se TEXT
almacena fuera de la fila, las consultas que no involucran la TEXT
columna suelen ser más rápidas.
Algunos ejemplos de TEXT
para qué es bueno:
- Comentarios de blogs
- páginas wiki
- fuente del código
Algunos ejemplos de VARCHAR
para 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 UNICODE
habilitado NTEXT
y NVARCHAR
tambié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 row
si sp_tableoption
desea que siempre se almacenen fuera de la fila.
Como se mencionó anteriormente y aquí , TEXT
quedará obsoleto en futuras versiones:
La
text in row
opció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 utilizantext in row
. Le recomendamos que almacene datos de gran tamaño utilizando los tipos de datosvarchar(max)
,nvarchar(max)
ovarbinary(max)
. Para controlar el comportamiento dentro y fuera de la fila de estos tipos de datos, utilice lalarge value types out of row
opción.
Si utiliza SQL Server 2005 o posterior, utilice varchar(MAX)
. El text
tipo de datos está en desuso y no debe utilizarse para nuevos trabajos de desarrollo. De los documentos :
Importante
ntext
,text
yimage
los 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.
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 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.