在Oracle中,varchar(max)的等效类型是什么?

45

在Oracle中,varchar(max)的等价物是什么?

CLOB(字符大对象)。


告诉我varchar(max)是什么意思,我会给你Oracle的等效语句。我怀疑它不是CLOB。 - dacracot
1
VARCHAR(MAX)是可变长度字符字段,大小可能达到2GB(我认为)。与TEXT(相当于CLOB)不同的是,VARCHAR函数适用于它。 - Dave Markle
在Oracle中,TEXT?啊,可能是一个同义词。使用CLOB,不要使用TEXT。 - Mark Brady
@Mark -- 抱歉,SQL Server 中的 TEXT 与 Oracle 中的 CLOB 是同一概念。 - Dave Markle
7个回答

36

Varchars在Oracle中限制为4000个字符。除此之外,您必须使用LONG或CLOB。建议优先使用CLOBs,LONG是较老的等效类型。

根据Oracle文档

LOB与LONG和LONG RAW的区别

LOBs在许多方面都不同于较老的LONG和LONG RAW数据类型。

  • LOB的最大大小为4 GB,而LONG和LONG RAW的最大大小为2 GB。
  • 您可以对LOB使用随机访问和顺序访问方法;但只能对LONG和LONG RAW使用顺序访问方法。
  • LOB(除了NCLOB)可以是您定义的对象类型的属性。
  • 表可以有多个LOB列,但只能有一个LONG或LONG RAW列。

建议将现有的LONG和LONG Raw属性迁移到LOB。Oracle计划在未来的发行版中停止支持LONG和LONG RAW类型。有关迁移的更多信息,请参见Oracle8迁移。


4
Longs和CLOBS很麻烦。大多数针对varchar的函数不能与它们一起使用,也不应该这样做。 - dacracot
4
是的,但如果您想要使用 Oracle 处理超过4000个字符的内容,您就没有太多选择了。 - cletus
在后续版本中,更多的VARCHAR函数(如substr)可用于CLOBs。当然,并非全部,但是一般来说,您对MB长度字符串所做的事情与只有几十个字符的字符串不同。 - Gary Myers
通常可以使用DBMS_LOB中的函数来实现您想要的功能。考虑到我们现在拥有的硬件,我同意4k对于varchar2来说太短了。 - WW.
5
确切地说,Varchar 字段的大小限制是 4000 个 字节,这相当于不超过 4000 个 字符,但如果存储的是多字节字符数据,实际上可能会更少。请参阅 Oracle 数据类型文档 - Michael Schaefers

12

据我所了解,VARCHAR(MAX) 数据类型是 SQL Server 2005 特有的一种指定文本字段的方式,可以是小型的(在 SQL Server 中最多8000个字符)大型的(在 SQL Server 中最多2GB)。随着内容从小范围增长到大范围,数据库会处理存储的更改在幕后

Oracle 没有相应的数据类型。

您可以使用 VARCHAR2 存储小型文本(在 pl/sql 中最多32767字节,在表定义中最多4000字节),或者您可以使用 CLOB 存储潜在很大的文本(它是一种专用的 BLOB 数据类型)。


4

在PL/SQL中,VARCHAR2可以达到32767字节。对于SQL而言,限制为4000字节(如果您使用多字节字符集,则可能少于4000个字符)。


这并不适用于VARCHAR(MAX)列。 - Dave Markle
@Dave -- 我认为Igor的回答是针对Oracle特定的。 - Dave Costa

0
据我所知,没有相应的等价物。在ORACLE中最接近的是CLOB,它与SQL Server中的TEXT在“旧时代”的限制方面有着相同的局限性。

你不能像使用VARCHAR(MAX)那样使用大多数字符串操作函数来处理TEXT类型的数据,比如在字符串中查找单个字符、模式匹配等等,这些都无法通过标准的SQL函数实现。 - Dave Markle

0

0

我过去使用的一种方法(MS SQL,在Varchar(max)之前):

在表中放置两个列,一个小型Varchar(例如255),另一个是Text。然后构建您的应用程序,使其使用Varchar列处理小数据,将Text保留为空。如果数据大于Varchar,则将其保留为空并存储在Text中。这样,小数据不会占用服务器上的单独页面。这里的权衡是所有使用数据的应用程序都必须同意此方案,并具有相应的逻辑来解决它。但是它运行良好。

我认为在Oracle中也是如此,只需将Varchar替换为Varchar2,将Text替换为CLOB即可。我不敢自称知道varchar的正确大小-这取决于数据,还取决于表中的其他列。


1
当您无法使用varchar(max)或nvarchar(max)时,我认为在SQL Server中拥有两个列的更清晰的解决方案是使用“行内文本”表选项。您可以指定文本,ntext和图像字符串的最大限制,从24到7,000字节,以存储在数据行中。请参阅sp_tableoption的帮助。例如 EXEC sp_tableoption N'MyTable','text in row','1000' - Ross Bradbury

-1

在Oracle 11g-r2及以下版本中没有相应的功能。如果需要,可以迁移到支持该功能的其他DMMS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接