2012-01-10 53 views
0

目前我們正在從Delphi 2007遷移到Delphi XE2以支持Unicode。我們將大型XML數據作爲Blob存儲在數據庫中。要插入的BLOB值,爲我們使用以下將Unicode數據存儲到數據庫中

Param.DataType := ftBlob; 
Param.AsBlob := Value; 

的代碼,但現在支持Unicode的東西在數據庫領域,我們conveted在數據庫中的所有BLOB字段爲nvarchar(最大)。我們改變了上面的代碼

Param.DataType := ftwideString; 
Param.AsString := Value; 

這是做正確的事,還是應該進行不同的處理,以統一的數據存儲到數據庫中。

+0

你想使用什麼編碼的數據? UTF-8通常是一個不錯的選擇。 – 2012-01-10 10:13:14

+0

你使用SQL服務器嗎?如果是這樣的話,你可以使用XML數據類型(它提供'XQuery'支持),它解析爲'ftMemo'(我認爲它與'nvarchar(MAX)'相同)。 – kobik 2012-01-10 13:51:14

+0

此問題的答案取決於您正在使用的數據訪問組件。 ADO? SQL Server版本? SQL Antive客戶端正在使用中? – 2012-01-10 13:53:08

回答

3

BLOBs會存儲你拋出的任何東西,而不會推斷任何事情。雖然他們可能沒有什麼操縱能力,但他們永遠不會修改數據。另一方面,基於字符的字段(甚至是CLOB)將具有關聯的字符集。因此,存儲在那裏的數據將從源字符集和目標字符集中來回轉換。例如,如果您的XML文件採用UTF-8編碼,並且該字段爲UTF-16,則在寫入和讀取時將進行轉換。當然,如果兩種編碼都是相同的,則不執行轉換。如果你的數據庫缺少一個XML類型,我會將它們存儲在二進制lobs中,如果它們可以用不同的編碼,並且不需要對它們進行操作(但是需要寫入/讀取)。如果他們總是使用相同的編碼,角色吊球可能更容易處理。對於大型XML文件使用字符字段會導致由於最大字段大小而導致的錯誤。

1

雖然你的解決方案應該工作,我會建議保持BLOB字段格式,使用UTF8作爲默認編碼數據庫(火鳥爲例):

CREATE DATABASE 'localhost:c:\Data\MyDatabase.FDB' user 'SYSDBA' password 'masterkey' 
    DEFAULT CHARACTER SET UTF8; 

和你的XML字符串轉換爲以保存它之前UTF8編碼作爲blob。

+1

UTF-8並不理想 – OnTheFly 2012-01-10 14:57:13

相關問題