varchar(max) MS SQL Server 2000,有问题吗?

Posted

技术标签:

【中文标题】varchar(max) MS SQL Server 2000,有问题吗?【英文标题】:varchar(max) MS SQL Server 2000, problems? 【发布时间】:2009-04-10 14:19:34 【问题描述】:

我继承了一个当前运行 SQL Server 2000 作为其后端的 asp.net 网站项目。

我一直在使用 SQL Server 2005 Express 对数据库的本地副本进行一些数据库更改。我已经使用varchar(max) 列创建了一个表。它们用于存储任意长度的 Xhtml 的 sn-ps。

在 *** 上浏览时,我遇到了这个问题: Are there any disadvantages to always using nvarchar(MAX)?

用户 mattruma 说他发现了在 SQL Server 2000 上使用 varchar(max) 的“困难方法”。

鉴于实时数据库在 SQL Server 2000 上运行,我应该使用什么来代替 varchar(max)

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

VARCHAR(Max) 是在 SQL Server 2005 中引入的,并且不适用于 SQL Server 2000。您需要使用 VARCHAR(8000) 之一,前提是它足够大。否则你需要使用TEXT

编辑

此外,如果您切换到VARCHAR(8000),请记住单行不能超过 8060 字节的限制。因此,如果您填写 varchar(8000) 表并有一堆其他大列,您将收到错误。这就是Text 的用武之地。

Text 具有性能影响,因为默认情况下它存储在单独的位置,并且它们在表中保留一个指针。有一个设置选项可以更改此行为,以便将文本类型保留在表格中,直到它们达到特定大小。如果您有大部分小斑点,则可能需要启用此功能。

【讨论】:

我们不得不切换到 VARCHAR(8000)。【参考方案2】:

如果您的实时数据库是不支持它们的 SQL Server 2000,那么 varchar(MAX) 限制听起来是一个有争议的问题。如果要存储的字符数超过 8K,则几乎只剩下另一个选项,TEXT 列。但是,请注意TEXT 列也有很多限制。

例如,您不能轻松地对它们进行排序或分组,也不能将它们与其他列进行比较。那就是你不能说Select * from mytable where Mytext1 = mytext2

其他相关问题:

我建议使用NTextNVarchar 列,无论您采用何种方式来支持Unicode。 如果表有很多其他列,并且varchar(8000) 列很可能经常接近满,则可能会遇到行限制为 8K 的问题。请记住这一点。

【讨论】:

【参考方案3】:

使用 TEXT 列。

【讨论】:

如果您使用文本字段,则会妨碍对该字段的可能搜索。 @TheTXI - OP 的问题中没有与在该列上搜索相关的任何内容。 我不推荐使用 TEXT 数据类型,因为it will be removed in a future version of Microsoft SQL Server.【参考方案4】:

这取决于您的需求。您可以使用 TEXT 列代替 VARCHAR(MAX),但您必须确保您的实现不需要在该字段上进行搜索,因为您无法在 TEXT 和 NTEXT 字段上进行类似的比较。

如果您可以将自己限制为 8000 个字符,我会使用 VARCHAR(8000) 列来存储信息。

【讨论】:

nvarchar(4000) 你的意思是?还是 varchar(8000)?

以上是关于varchar(max) MS SQL Server 2000,有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

我想为在 MS Azure Synapse 中存储为 varchar(max) 的匹配标记提取 XML 值

SQL 2008 - varchar(max)与文本数据类型[重复]

SQL server Varchar(max) 和占用的空间

SQL Server Always Encrypted:操作数类型冲突:varchar 与 varchar(max) 不兼容

使用 C# 和存储过程从 SQL Server 检索 VarChar(MAX)

SQL Server 自动确定来自 VARCHAR(MAX) 列的数据类型