CLOB vs. VARCHAR2,还有其他的选择吗?



我使用DevArt的dotConnect和实体开发人员为我的应用程序。我使用Entity-First特性创建了这些表。

我注意到许多列类型被设置为CLOB。我只有MySQL和Microsoft SQL server的经验,所以我不确定是否在应用程序中使用CLOB。我做了一些阅读,发现CLOB适用于大数据块。

问题是:

  1. 对大多数字段(例如用户的性别(应该是varchar(1))或全名)使用CLOB是否可行?将CLOB字段转换为VARCHAR2的步骤需要删除列,然后重新创建它,并且在DevArt的实体资源管理器中存在错误,所以如果可能的话,我想避免它。编辑:我刚刚发现,如果你设置一个字符串字段的最大长度,它将自动是一个VARCHAR2。

  2. 在Oracle中是否有类似的TINYTEXT ?

对于应该是VARCHAR2(1)的列使用CLOB数据类型是一个非常糟糕的主意。除了开销(实际上是最小的,因为Oracle将处理&lt的内联clob;我们应该始终努力在模式中使用最准确的数据表示:这是一个很好的实践。

这似乎真的是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>

调用这个过程可以用通常的方式自动执行或编写脚本。

Gender列这样的东西使用CLOB至少是极不寻常的。如果这个工具生成的DDL指定LOB数据应该内联存储而不是外联存储,那么我不认为会出现任何可怕的性能问题。但是,您可能会给其他不能很好地处理lob的访问数据库的工具带来问题。

Oracle中没有对应于MySQL中的Tinytext。CLOB就是CLOB

一个更简单的解决方案是进入模型资源管理器->模型。Store -> Tables/Views,找到所需的列,并将该字段的类型更改为VARCHAR2。
然后运行Update Database from Model向导以将更改持久化到数据库。
不要忘记设置MaxLength facet(然而,这个问题已经在即将到来的Beta版本中修复了)。

最新更新