繁体   English   中英

nvarchar(max)vs NText

[英]nvarchar(max) vs NText

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

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

优点是您可以在nvarchar(max)上使用LENLEFT等函数,而不能对ntexttext 使用nvarchar(max)比使用WRITETEXTUPDATETEXT text更容易。

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

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

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

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

nvarchar(max)

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

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

你应该显然使用nvarchar(max)

MSDN

希望增加转换经验。 我在古代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的情况可能更复杂,但我还没有解决。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM