nvarchar(max)与NText


183

在SQL Server 中使用nvarchar(max)vs. NText数据类型的优点和缺点是什么?我不需要向后兼容性,因此很好,nvarchar(max)在较早的SQL Server版本中不支持。

编辑:很显然的问题也适用于TEXTIMAGE对比varchar(max),并varbinary(max)为那些在搜寻这些数据类型后。

Answers:


197

优点是可以使用诸如LENand LEFTon之类的函数,nvarchar(max)而不能针对ntextand进行此操作text。它也nvarchar(max)text您必须使用WRITETEXTand的地方容易UPDATETEXT

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


12
SQL Server 2016显然仍会支持它们。
2015年

1
@Confluence从历史上看,就SQL Server中的存在而言,text和nText的数据类型是否比varchar和nvarchar更早?
RBT

您不必使用WRITETEXT和UPDATETEXT。也许在2010年您做到了!感兴趣的任何进一步的信息。
Simon_Weaver

38

VARCHAR(MAX)足够容纳TEXT场地。TEXTNTEXTIMAGESQL Server 2000中的数据类型将在SQL Server的未来版本中被废止,SQL Server 2005提供了对数据类型的向后兼容性,但建议使用的是新的数据类型VARCHAR(MAX)NVARCHAR(MAX)以及VARBINARY(MAX)


32

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

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

围棋nvarchar(max)


13

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


我不明白的是他们说可以,nvarchar(max)但是我最多只能输入4000个字符。如果我想要一个字段容纳更多的东西怎么办?
VoidKing 2013年

2
nvarchar(max)不会将您限制为4000个字符。您有无限数量的字符。此外,SQL Server不推荐使用text和ntext。这意味着在将来的版本中,将不再支持它们。
兰迪·明德

OIC,我使用的是SQL Server CE,但确实将我的nvarchar(max)字符数限制为4000个。因此,对于SQL Server Compact,我不得不ntext在某些情况下使用。当他们停止使用它时,我想我将不必升级某些站点。
VoidKing 2013年

1
@RandyMinder nvarchar(max)不是无限存储。根据SQL Server文档,“ max表示最大存储大小为2 ^ 31-1字节(2 GB)。以字节为单位的存储大小是所输入数据的实际长度+ 2字节的两倍。”
2016年



3

希望增加我的转换经验。我text在古代Linq2SQL代码中有很多领域。这是为了允许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而言,情况可能更为复杂,但我还没有解决。


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.