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
。
其他相关问题:
我建议使用NText
或NVarchar
列,无论您采用何种方式来支持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) 不兼容