nvarchar(max)vs NText

时间:2010-01-25 16:54:10

标签: sql-server sql-server-2005 sql-server-2008 text nvarchar

在SQL Server中使用nvarchar(max)NText数据类型有哪些优缺点?我不需要向后兼容性,因此在较旧的SQL Server版本中不支持nvarchar(max)

修改:显然,该问题也适用于TEXTIMAGEvarchar(max)varbinary(max),对于那些搜索这些数据的人来说 - 类型以后。

8 个答案:

答案 0 :(得分:183)

优点是您可以在LEN上使用LEFTnvarchar(max)等功能,而不能对ntexttext执行此操作。使用nvarchar(max)text使用WRITETEXTUPDATETEXT更容易。

此外,textntext等已被弃用(http://msdn.microsoft.com/en-us/library/ms187993.aspx

答案 1 :(得分:36)

VARCHAR(MAX)足以容纳TEXT字段。 SQL Server 2000的TEXTNTEXTIMAGE数据类型将在SQL Server的未来版本中弃用,SQL Server 2005提供向后兼容的数据类型,但建议使用新数据类型为VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)

答案 2 :(得分:31)

ntext将始终将其数据存储在单独的数据库页面中,而nvarchar(max)将尝试将数据存储在数据库记录本身中。

所以nvarchar(max)有点快(如果你的文字小于8 kB)。我还注意到数据库大小会稍微增长,这也很好。

转到nvarchar(max)

答案 3 :(得分:12)

nvarchar(max)是你想要使用的。最大的优点是您可以在此数据类型上使用所有T-SQL字符串函数。 ntext无法做到这一点。我不知道任何真正的缺点。

答案 4 :(得分:4)

Text(与NTextImage一起)的最大缺点是它将在SQL Server的未来版本中删除,如the documentation。这将有效地使您的架构在发布该版本的SQL Server时更难升级。

答案 5 :(得分:4)

你应该显然使用nvarchar(max)

<强> MSDN

答案 6 :(得分:1)

我想补充一点,您可以使用.WRITE子句进行部分或完整更新,并将高性能附加到varchar(max)/nvarchar(max)数据类型。

Here您可以找到使用.WRITE子句的完整示例。

答案 7 :(得分:1)

希望增加转换经验。我在古代Linq2SQL代码中有很多text个字段。这是为了允许索引中的text列为rebuilt ONLINE

首先我已经了解了多年的好处,但总是假设转换意味着一些可怕的长查询,其中SQL Server必须重建表并复制所有内容,关闭我的网站并提高我的心率。

我还担心如果对列类型进行某种验证,Linq2SQL可能会导致错误。

很高兴报告,ALTER命令立即返回 - 因此它们肯定只是更改表元数据。可能会发生一些离线工作,将&lt; 8000字符数据带回到表内,但ALTER命令是即时的。

我运行以下命令查找需要转换的所有列:

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

这给了我一个很好的查询列表,我刚刚选择并复制到一个新窗口。就像我说的那样 - 立即运行它。

enter image description here

Linq2SQL非常古老 - 它使用了一个将表格拖到上面的设计器。对于EF Code,情况可能会更复杂,但我还没有解决这个问题。