nvarchar(max)与NText的区别

206
使用SQL Server中的nvarchar(max)NText数据类型有什么优缺点?我不需要向后兼容,所以nvarchar(max)在旧版本的SQL Server中不支持也没问题。 编辑:显然,这个问题也适用于TEXTIMAGEvarchar(max)varbinary(max)之间的比较,供后来者搜索这些数据类型时参考。
8个回答

212
优点在于您可以对nvarchar(max)使用类似LENLEFT之类的函数,而无法对ntexttext进行操作。此外,使用nvarchar(max)比使用text更加方便,因为您需要使用WRITETEXTUPDATETEXT才能操作text
此外,textntext等正在被弃用(http://msdn.microsoft.com/en-us/library/ms187993.aspx)。

14
显然,SQL Server 2016似乎仍将支持它们。 - Confluence
1
@Confluence 从 SQL Server 存在的角度来看,text 和 nText 这两种数据类型是否比 varchar 和 nvarchar 更老? - RBT
你不必使用WRITETEXT和UPDATETEXT。也许在2010年你需要使用它们!如果需要更多信息,请联系我们。 - Simon_Weaver

46

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

因此,如果您有小于8kB的文本,则nvarchar(max)会稍微快一些。我还注意到数据库大小增长的速度稍微慢一些,这也很好。

nvarchar(max)


40

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


16

nvarchar(max)是你应该使用的数据类型。最大的优势是你可以在这种数据类型上使用所有T-SQL字符串函数,而这在ntext上是不可能的。我不知道任何真正的缺点。


我不理解的是,他们建议使用 nvarchar(max),但这会限制我只能存储4000个字符。如果我想要一个可以容纳更多字符的字段怎么办? - VoidKing
2
nvarchar(max)不限制您的字符数,您可以拥有无限数量的字符。此外,SQL Server已弃用文本和ntext。这意味着在将来的版本中,它们将不再受支持。 - Randy Minder
OIC,我正在使用SQL Server CE,它将我的nvarchar(max)限制为4000个字符。因此,对于SQL Server Compact,我在某些情况下别无选择,只能使用ntext。当他们停止支持它时,我想我只能选择不升级一些网站了。 - VoidKing
1
@RandyMinder,nvarchar(max)并不是无限制的存储空间。根据SQL Server文档,“max表示最大存储大小为2^31-1字节(2 GB)。存储大小以字节为单位,是输入数据实际长度的两倍+2个字节。” - Shiv

7

我想分享一下我在转换过程中的经验。在我的古老的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 first,情况可能更加复杂,但我还没有解决这个问题。

4
< p > Text(连同NTextImage)的最大缺点是根据文档,它将在SQL Server的未来版本中被删除。当该版本的SQL Server发布时,这将使您的模式升级更加困难。


4

您应该明显使用 nvarchar(max)

MSDN


1
我想补充一下,您可以使用 .WRITE 子句进行部分或完整更新,并对 varchar(max)/nvarchar(max) 数据类型进行高性能追加。 这里 您可以找到使用 .WRITE 子句的完整示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接