關聯式資料庫都提供大文檔的儲存和提取。對於視頻資料、音頻資料、圖象資料等大文檔,一般需要 另外開闢欄位用於儲存摘要資訊,因此在查詢和檢索時並不訪問大欄位,而只是在儲存和提取時才操作 大欄位。
例如,你不能對Oracle中的LONG RAW類型進行LIKE介詞的查詢,更不能使用等號“ =”查詢。 這對於儲存大段文本(容量超過2K)同時又需要全文檢索索引是相當不便的。本文將介紹如何利用資料庫的 字串資料型別存取和查詢大段文本。這裡以Oracle資料庫和Delphi應用程式為例,重點介紹如何在資料庫中存取 RTF文檔。
對於純文字,可以簡單地將其分割成若干個串,分別儲存到VARCHAR(2000)欄位中即可。在查詢時 可以使用LIKE比較,從而達到全文檢索索引的目的。為了保留換行等段落資訊,應當將斷行符號換行(#13#10) 也作為串的一部分進行儲存。資料錄入時可以提供Memo控制項(不是DBMemo)進行錄入,然後順序串連各行,當串連成的串臨近2000個字元(單位元組字元)長度時,就存入一條記錄,然後對剩餘的行重複上述操作。這樣,最終將純文字存成若干長度不超過2000的VARCHAR(2000) 欄位中。這裡需要另外開闢欄位 用於儲存文本編號和子序號,以便區分不同的文本和讀取文本時順序串連所有的子串。查詢純文字時, 就可以象查詢普通的VARCHAR 欄位一樣,可以使用LIKE,也可以使用等號“ =”(幾乎不需要使用)。 需要注意的是,可能使用者提供的關鍵字正好被儲存在不同的子串中,這時是查詢不到的。因此,在設計時應當考慮儲存重複的串。例如,每個子串中僅有前1900個字元是有效字元,最後100 個字元用於儲存 下一個子串的前100 個字元。這樣就避免了關鍵字被分開的情況。唯一的不足是,必須限制使用者輸入的 查詢關鍵字長度不得超過100 個字元(50個漢字),但這很正常,算不上不足。
事實上,同樣可以利用這一技巧對 RTF文檔進行存取和查詢。這時,用於錄入和顯示 RTF文檔的是 RichEdit控制項(不是DBRichEdit),而不再是Memo控制項。對於 RTF文檔的存取,不能象存取純文字那樣 通過Memo的屬性Lines.Strings[Index]進行操作(儘管RichEdit控制項具有相同的屬性),因為這樣做就 無法儲存文檔的格式了。需要利用的是RichEdit的兩個方法:SaveToFile和LoadFromFile。需要瞭解的 是, RTF檔案中用純字元描述字型、字型大小、文本等各種格式資訊和內容資訊。因此,儲存和提取時可以 視為純文字進行操作。但對於查詢,就不能直接用LIKE加關鍵字的方式進行。因為 RTF文檔中的每一個 漢字都是用特殊的表示方法儲存,只有單位元組字元是原樣儲存。所以在查詢時要對關鍵字進行處理才能 用在查詢語句中。
在測試這個例子之前,必須有如下的資料結構,這裡以Oracle建立表的 SQL語句形式給出:
(*
CREATE TABLE TEST( { 表名為 TEST }
DOCID NUMBER NOT NULL, { 文檔編號 }
DOCNAME VARCHAR(40) NOT NULL, { 文檔標題 }
SUBID NUMBER NOT NULL, { 文檔子編號 }
TEXT VARCHAR(2000) NOT NULL, { 子文檔內容 }
PRIMARY KEY(DOCID, SUBID)); { 聯合主鍵 }
*)