nvarchar(max)vs NText

Dav*_*fer 178 sql-server text nvarchar sql-server-2005 sql-server-2008

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

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

SQL*_*ace 190

其优点是可以使用的功能,如LENLEFTnvarchar(max),你不能这样做,对ntexttext.它nvarchar(max)text你必须使用WRITETEXT和使用更容易UPDATETEXT.

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

  • [SQL Server 2016](https://msdn.microsoft.com/en-us/library/ms187993.aspx)显然仍然会支持它们. (11认同)

gar*_*kal 37

VARCHAR(MAX)足以容纳TEXT田地.TEXT,NTEXTIMAGESQL Server 2000中的数据类型将在以后的SQL Server版本,SQL Server 2005提供了向下兼容的数据类型被弃用,但建议要使用的是新的数据类型VARCHAR(MAX),NVARCHAR(MAX)以及VARBINARY(MAX).


GvS*_*GvS 32

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

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

nvarchar(max).


Ran*_*der 12

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

  • nvarchar(max)不限制为4000个字符.你有无限数量的字符.此外,SQL Server已弃用text和ntext.这意味着在将来的版本中,将不再支持它们. (2认同)

Sim*_*ver 6

想添加我的转换经验。我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
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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