2010-06-07 64 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