2010-06-07 65 views
0

这涉及到一个问题:How to store unlimited characters in Oracle 11g?字符溢出Oracle 11g中的多列?

如果最大我需要的是8000个字符,可我只加3个VARCHAR2列,这样我将有4列,其中每一字符2000获得8000个字符。所以当第一列填满时,数值会溢出到下一列等等。这个设计会有什么不好的副作用吗?请建议。

+0

这是一个很大的文字 - 什么是你的使用情况,需要这么多? – 2010-06-07 21:17:52

回答

11

为什么不直接使用CLOB列呢?我读了你的其他链接,我不明白为什么你的DBA不喜欢这些类型的列。我的意思是,CLOB是Oracle针对此确切目的的一个重要功能。在购买Oracle时,贵公司为此功能付出了高昂的代价,那么为什么不利用Oracle实现最充分的功能,而不是试图提出黑客来做一些数据库并非真正设计的功能?

也许您不用花时间尝试设计黑客来克服由DBA创建的限制,您应该花一些时间教育您的DBA了解为什么CLOB是解决您的问题的正确功能。

当DB具有我需要做出好设计的功能时,我不会满意糟糕的设计。如果DBA是问题的话,那么他们需要改变他们的观点,或者我认为你应该去高层管理。

+1

+1很好的答案。特别是,我喜欢第1段的最后一句话。 – DCookie 2010-06-08 14:35:56

+0

@DCookie - 感谢赞美:)。 – dcp 2010-06-08 15:39:19

3

我同意dcp您应该使用CLOB。但是如果对你被迫只用VARCHAR2列,那么我会不会做“滚你自己的”无限的文字都感觉通过增加越来越多的VARCHAR2列的表是这样的:

create table mytable 
    (id integer primary key 
    , text varchar2(2000) 
    , more_text varchar2(2000) 
    , and_still_more_text varchar2(2000) 
); 

相反,我将文本移动到一个单独的子表是这样的:

create table mytable 
    (id integer primary key 
); 
create table mytable_text 
    (id references mytable(id) 
    , seqno integer 
    , text varchar2(2000) 
    , primary key (id, seqno) 
); 

然后你需要为每个MYTABLE行,在mytable_text使用多行,你可以插入尽可能多的文本。

+1

对于不使用CLOB的规范化方法+1。 – DCookie 2010-06-08 16:30:59

2

要添加到DCP的和托尼的出色答案:

你问,如果你提出的办法会不会有什么不良的副作用。这里有几件事要考虑:

  1. 假设你想要执行一个特定字符串的文本数据搜索。你的方法需要在包含你的文本的每一列重复搜索 - 导致一个复杂和低效的WHERE子句。
  2. 每当你想扩展你的文本字段时,你必须添加另一列,这意味着你必须修改你编码的每个地方(1)。
  3. 大家谁也保持这样的结构之后,你会骂你的名字;-)
+1

更糟 - 当搜索项跨越两列之间的边界时,搜索(点#1)将不起作用...点#3的+1) – 2010-06-09 01:50:42