nvarchar (max) vs NText


¿Cuáles son las ventajas y desventajas de usar los tipos de datos nvarchar(max) vs. NText en SQL Server? No necesito compatibilidad con versiones anteriores, por lo que está bien que nvarchar(max) no sea compatible con versiones anteriores de SQL Server.

Editar: Aparentemente la pregunta también se aplica a TEXT y IMAGE vs. varchar(max) y varbinary(max), para aquellos que buscan esos tipos de datos más tarde.

Author: Ajay2707, 2010-01-25

8 answers

Las ventajas son que puedes usar funciones como LEN y LEFT en nvarchar(max) y no puedes hacerlo contra ntext y text. También es más fácil trabajar con nvarchar(max) que text donde tenías que usar WRITETEXT y UPDATETEXT.

También, text, ntext, etc., están siendo obsoletos ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )

 178
Author: SQLMenace,
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-06-29 16:55:05

VARCHAR(MAX) es lo suficientemente grande como para acomodar el campo TEXT. TEXT, NTEXT y IMAGE los tipos de datos de SQL Server 2000 serán obsoletos en la futura versión de SQL Server, SQL Server 2005 proporciona compatibilidad con versiones anteriores a los tipos de datos, pero se recomienda utilizar nuevos tipos de datos que son VARCHAR(MAX), NVARCHAR(MAX) y VARBINARY(MAX).

 36
Author: garpunkal,
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
2013-11-14 10:08:34

ntext siempre almacenará sus datos en una página de base de datos separada, mientras que nvarchar(max) intentará almacenar los datos dentro del registro de la base de datos en sí.

Así que nvarchar(max) es algo más rápido (si tiene texto que es más pequeño como 8 kB). También noté que el tamaño de la base de datos crecerá un poco más lento, esto también es bueno.

Go nvarchar(max).

 30
Author: GvS,
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-02 13:56:42

nvarchar(max) es lo que quieres usar. La mayor ventaja es que puede utilizar todas las funciones de cadena de T-SQL en este tipo de datos. Esto no es posible con ntext. No soy consciente de ninguna desventaja real.

 10
Author: Randy Minder,
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
2013-11-14 09:57:48

Aparentemente deberías usar nvarchar(max):

MSDN

 4
Author: Andreas,
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
2013-07-19 05:32:54

La mayor desventaja de Text (junto con NText y Image) es que se quitará en una versión futura de SQL Server, como por la documentación. Eso hará que su esquema sea más difícil de actualizar cuando se lance esa versión de SQL Server.

 4
Author: Klaus Byskov Pedersen,
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
2013-11-14 09:58:33

Quiero añadir que puedes usar el .ESCRIBE la cláusula para actualizaciones parciales o completas y añade alto rendimiento a los tipos de datos varchar(max)/nvarchar(max).

Aquí puede encontrar un ejemplo completo de uso de la cláusula .WRITE.

 1
Author: gotqn,
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-10-21 06:08:05

Quería añadir mi experiencia con la conversión. Tenía muchos campos text en el antiguo código Linq2Sql. Esto era para permitir que text las columnas presentes en los índices se reconstruyeran EN LÍNEA.

Primero he sabido acerca de los beneficios durante años, pero siempre asumí que la conversión significaría algunas consultas largas y aterradoras donde SQL Server tendría que reconstruir la tabla y copiar todo, derribando mis sitios web y elevando mi ritmo cardíaco.

También me preocupaba que el Linq2Sql pudiera causar errores si estaba haciendo algún tipo de verificación del tipo de columna.

Feliz de informar, sin embargo, que los comandos ALTER regresaron AL INSTANTE, por lo que definitivamente solo están cambiando los metadatos de la tabla. Puede haber algún trabajo fuera de línea sucediendo para traer

Ejecuté lo siguiente para encontrar todas las columnas que necesitan conversión:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Esto me dio una buena lista de consultas, que acabo de seleccionar y copiar a un nueva ventana. Como dije, correr esto fue instantáneo.

introduzca la descripción de la imagen aquí

Linq2Sql es bastante antiguo: utiliza un diseñador al que se arrastran las tablas. La situación puede ser más compleja para EF Code primero, pero aún no he abordado eso.

 1
Author: Simon_Weaver,
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
2018-05-22 06:47:32