CLOB vs. VARCHAR2 还有其他选择吗?
Posted
技术标签:
【中文标题】CLOB vs. VARCHAR2 还有其他选择吗?【英文标题】:CLOB vs. VARCHAR2 and are there other alternatives? 【发布时间】:2011-04-20 13:42:10 【问题描述】:我正在为我的应用程序使用 DevArt 的 dotConnect 和 Entity Developer。我已经使用实体优先功能创建了表。
我注意到许多列类型设置为 CLOB。我只有使用 mysql 和 Microsoft SQL server 的经验,所以我不确定是否将 CLOB 用于应用程序。我做了一些阅读,发现 CLOB 用于大量数据。
问题是:
是否对大多数字段使用 CLOB,例如用户的性别(应该是 varchar (1) )或全名,可行吗?将 CLOB 字段转换为 VARCHAR2 的步骤需要删除列然后重新创建它,并且在 DevArt 的实体资源管理器中存在错误,因此我希望尽可能避免它。 编辑:我刚刚发现,如果您为字符串字段设置最大长度,它将自动成为 VARCHAR2。
Oracle 中是否有 TINYTEXT 的等效项?
【问题讨论】:
【参考方案1】:对于应该是 VARCHAR2(1) 的列使用 CLOB 数据类型是一个非常糟糕的主意。除了开销(实际上是最小的,因为 Oracle 会将
这似乎是 DevArt 工具的问题,或者您对如何使用它的理解(无意冒犯)。您应该有某种方法可以指定实体属性的数据类型和/或将这些规范映射到 Oracle 的物理数据类型的方法。如果这看起来有点含糊,我深表歉意,我对产品不熟悉。
所以,这是基本问题:
SQL> desc t69
Name Null? Type
----------------------------------------- -------- --------
COL1 CLOB
SQL>
SQL> alter table t69 modify col1 varchar2(1)
2 /
alter table t69 modify col1 varchar2(1)
*
ERROR at line 1:
ORA-22859: invalid modification of columns
SQL>
我们可以通过使用 DDL 更改表结构来修复它。因为模式有许多这样的列,所以值得自动化该过程。此函数删除现有列并将其重新创建为 VARCHAR2。它提供了将 CLOB 列中的数据迁移到 VARCHAR2 列的选项;你可能不需要这个,但它是为了完整性。 (这不是生产质量代码 - 它需要错误处理、管理 NOT NULL 约束等)
create or replace procedure clob2vc
( ptab in user_tables.table_name%type
, pcol in user_tab_columns.column_name%type
, pcol_size in number
, migrate_data in boolean := true )
is
begin
if migrate_data
then
execute immediate 'alter table '||ptab
||' add tmp_col varchar2('|| pcol_size|| ')';
execute immediate
'update '||ptab
||' set tmp_col = substr('||pcol||',1,'||pcol_size||')';
end if;
execute immediate 'alter table '||ptab
||' drop column '|| pcol;
if migrate_data
then
execute immediate 'alter table '||ptab
||' rename column tmp_col to '|| pcol;
else
execute immediate 'alter table '||ptab
||' add '||pcol||' varchar2('|| pcol_size|| ')';
end if;
end;
/
所以,让我们改变那一栏...
SQL> exec clob2vc ('T69', 'COL1', 1)
PL/SQL procedure successfully completed.
SQL> desc t69
Name Null? Type
----------------------------------------- -------- ---------------
COL1 VARCHAR2(1)
SQL>
可以自动调用此过程,也可以按常规方式编写脚本。
【讨论】:
我对这个工具还是新手,当然。我意识到可以在生成数据库之前为字段指定所需的数据类型为时已晚,但到那时我已经投入了很多小时的工作。【参考方案2】:将 CLOB 用于 Gender
之类的列至少是非常不寻常的。如果此工具生成的 DDL 指定 LOB 数据应内联存储而不是外联存储,我不希望出现任何可怕的性能问题。但是您可能会为访问数据库的其他工具带来问题,这些工具不能很好地处理 LOB。
Oracle 中没有与 MySQL 中的 Tinytext
等效的功能。 CLOB 就是 CLOB。
【讨论】:
【参考方案3】:更简单的解决方案是转到 Model Explorer -> Model.Store -> Tables/Views,找到必要的列并将该字段的类型更改为 VARCHAR2。 然后运行从模型更新数据库向导以将更改持久保存到数据库中。 不要忘记设置 MaxLength 方面(但是,它的问题已经在即将到来的 Beta 版本中修复)。
【讨论】:
以上是关于CLOB vs. VARCHAR2 还有其他选择吗?的主要内容,如果未能解决你的问题,请参考以下文章
oracle修改字段类型由varchar2修改为clob类型