ChatGPT解决这个技术问题 Extra ChatGPT

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

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


J
Jay Sullivan

优点是您可以在 nvarchar(max) 上使用 LENLEFT 等函数,而不能针对 ntexttext 这样做。使用 nvarchar(max) 也比必须使用 WRITETEXTUPDATETEXTtext 更容易。

此外,不推荐使用 textntext 等 (http://msdn.microsoft.com/en-us/library/ms187993.aspx)


SQL Server 2016 显然仍会支持它们。
@Confluence 从历史上看,就它们在 SQL Server 中的存在而言, text 和 nText 是否比 varchar 和 nvarchar 更旧的数据类型?
您不必使用 WRITETEXT 和 UPDATETEXT。也许在 2010 年你做到了!有兴趣了解更多信息。
G
GvS

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

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

nvarchar(max)


b
bluish

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


b
bluish

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


我不明白的是他们说要使用 nvarchar(max) 但这将我限制为 4000 个字符。如果我想要一个字段容纳更多怎么办?
nvarchar(max) 不限制您使用 4000 个字符。你有无限数量的字符。此外,SQL Server 已弃用 text 和 ntext。这意味着在未来的版本中,它们将不再受支持。
OIC,我使用的是 SQL Server CE,它确实将我的 nvarchar(max) 限制为 4000 个字符。所以对于 SQL Server Compact,在某些情况下我别无选择,只能使用 ntext。当他们停止使用它时,我想我将不必升级某些站点。
@RandyMinder nvarchar(max) 不是无限存储。根据 SQL Server 文档,“max 表示最大存储大小为 2^31-1 字节 (2 GB)。存储大小(以字节为单位)是输入数据的实际长度 + 2 字节的两倍。”
S
Simon_Weaver

想添加我的转换经验。我在古老的 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 首先的情况可能更复杂,但我还没有解决这个问题。


P
Prahalad Gaggar

您显然应该使用 nvarchar(max)

MSDN


b
bluish

Text(连同 NTextImage)的最大缺点是它将在 SQL Server 的未来版本中被删除,如 the documentation。当该版本的 SQL Server 发布时,这将有效地使您的架构更难升级。


g
gotqn

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

Here 您可以找到使用 .WRITE 子句的完整示例。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅