198

在 SQL Server中使用nvarchar(max)vs.数据类型有哪些优点和缺点?NText我不需要向后兼容,所以nvarchar(max)旧的 SQL Server 版本不支持它很好。

编辑:显然,对于那些稍后搜索这些数据类型的人来说,这个问题也适用于TEXTand IMAGEvs. varchar(max)and 。varbinary(max)

4

8 回答 8

207

优点是您可以使用LENLEFTon之类的功能,nvarchar(max)而不能针对ntextand执行此操作textnvarchar(max)它也比text你必须使用的地方更容易使用WRITETEXTUPDATETEXT.

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

于 2010-01-25T16:56:55.203 回答
43

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

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

nvarchar(max)

于 2010-06-02T13:56:42.403 回答
40

VARCHAR(MAX)大到足以容纳TEXT场地。TEXT,NTEXT并且IMAGESQL Server 2000 的数据类型将在 SQL Server 的未来版本中被弃用,SQL Server 2005 提供了对数据类型的向后兼容性,但建议使用新的数据类型,VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)

于 2010-01-25T16:56:33.573 回答
16

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

于 2010-01-25T16:57:54.790 回答
6

想添加我的转换经验。我在古代 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

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

在此处输入图像描述

Linq2SQL 相当古老——它使用一个设计器,您可以将表格拖到上面。EF Code 首先的情况可能更复杂,但我还没有解决这个问题。

于 2018-05-22T06:47:32.657 回答
4

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

于 2010-01-25T16:57:55.243 回答
4

您显然应该使用nvarchar(max)

MSDN

于 2010-01-25T17:00:39.780 回答
1

我想补充一点,您可以使用.WRITEvarchar(max)/nvarchar(max)子句进行部分或全部更新以及对数据类型进行高性能附加。

在这里您可以找到 using.WRITE子句的完整示例。

于 2014-10-10T11:22:49.273 回答