nvarchar(max) vs NText

在SQL Server中使用nvarchar(max)NText数据类型的优点和缺点是什么?我不需要向后兼容,所以在旧的SQL Server版本中不支持nvarchar(max)是没有问题的。

显然,对于稍后搜索这些数据类型的人来说,这个问题也适用于TEXTIMAGE vs. varchar(max)varbinary(max)

170403 次浏览

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

这样做的好处是你可以在nvarchar(max)上使用LENLEFT这样的函数,而不能对ntexttext这样做。与使用WRITETEXTUPDATETEXTtext相比,使用nvarchar(max)也更容易。

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

nvarchar(max)是你想要使用的。最大的优点是可以在此数据类型上使用所有T-SQL字符串函数。这在ntext中是不可能的。我不知道有什么真正的缺点。

Text(以及NTextImage)的最大缺点是它将在未来的SQL Server版本中被删除,就像通过的文档一样。这将有效地使您的模式更难升级时,该版本的SQL Server将发布。

显然你应该使用nvarchar(max):

MSDN

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

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

nvarchar(max)去。

我想补充的是,你可以使用.WRITE子句对varchar(max)/nvarchar(max)数据类型进行部分或全部更新和高性能追加。

在这里你可以找到使用.WRITE子句的完整示例。

想补充一下我皈依的经验。我在古老的Linq2SQL代码中有许多text字段。这是为了允许索引中出现的text列为重建在线

首先,多年来我已经知道了它的好处,但一直认为转换将意味着一些可怕的长查询,SQL Server将不得不重新构建表并复制所有内容,使我的网站瘫痪并提高我的心跳。

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

但是很高兴地报告,ALTER命令立即返回—所以它们肯定只是更改表元数据。可能会发生一些脱机工作,将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来说,情况可能更复杂,但我还没有解决这个问题。