在 SQL Server 中使用 nvarchar(max)
与 NText
数据类型的优缺点是什么?我不需要向后兼容,因此旧 SQL Server 版本不支持 nvarchar(max)
很好。
编辑:显然这个问题也适用于 TEXT
和 IMAGE
与 varchar(max)
和 varbinary(max)
,对于那些稍后搜索这些数据类型的人。
优点是您可以在 nvarchar(max)
上使用 LEN
和 LEFT
等函数,而不能针对 ntext
和 text
这样做。使用 nvarchar(max)
也比必须使用 WRITETEXT
和 UPDATETEXT
的 text
更容易。
此外,不推荐使用 text
、ntext
等 (http://msdn.microsoft.com/en-us/library/ms187993.aspx)
ntext
将始终将其数据存储在单独的数据库页面中,而 nvarchar(max)
将尝试将数据存储在数据库记录本身中。
所以 nvarchar(max)
稍微快一些(如果您的文本小于 8 kB)。我还注意到数据库大小会稍微变慢,这也很好。
去nvarchar(max)
。
VARCHAR(MAX)
大到足以容纳 TEXT
字段。 SQL Server 2000 的 TEXT
、NTEXT
和 IMAGE
数据类型将在 SQL Server 的未来版本中弃用,SQL Server 2005 提供对数据类型的向后兼容性,但建议使用 VARCHAR(MAX)
的新数据类型, NVARCHAR(MAX)
和 VARBINARY(MAX)
。
nvarchar(max)
是您想要使用的。最大的优点是您可以在此数据类型上使用所有 T-SQL 字符串函数。这对于 ntext
是不可能的。我不知道任何真正的缺点。
nvarchar(max)
但这将我限制为 4000 个字符。如果我想要一个字段容纳更多怎么办?
nvarchar(max)
限制为 4000 个字符。所以对于 SQL Server Compact,在某些情况下我别无选择,只能使用 ntext
。当他们停止使用它时,我想我将不必升级某些站点。
想添加我的转换经验。我在古老的 Linq2SQL 代码中有很多 text
字段。这是为了允许索引中存在的 text
列是 rebuilt ONLINE。
首先,多年来我一直知道这些好处,但一直认为转换将意味着一些可怕的长查询,其中 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
这给了我一个很好的查询列表,我刚刚选择并复制到一个新窗口。就像我说的 - 运行它是即时的。
https://i.stack.imgur.com/peJI8.png
Linq2SQL 相当古老——它使用一个设计器,您可以将表格拖到上面。 EF Code 首先的情况可能更复杂,但我还没有解决这个问题。
Text
(连同 NText
和 Image
)的最大缺点是它将在 SQL Server 的未来版本中被删除,如 the documentation。当该版本的 SQL Server 发布时,这将有效地使您的架构更难升级。