2014-05-05 103 views
1

我想將oracle數據庫從非unicode服務器(EL8ISO8859P7字符集和AL16UTF16 NCHAR字符集)移動到unicode服務器。特別適用於具有AL32UTF8字符集的Oracle Express服務器。將oracle數據庫從非unicode服務器遷移到unicode服務器

僅導出(exp)和導入(imp)數據失敗。我們有很多varchar2列,其長度以字節爲單位。當他們的內容被映射到unicode時,它們會佔用更多的字節並被截斷。

我試過如下:
- 原始數據庫的所有VARCHAR2列的長度與一個腳本倍增(VARCHAR2(10)變爲VARCHAR2(20))
- 出口
- 導入到新的服務器

它工作。顯然,加倍是任意的,我可能應該用CHAR語義將它們改爲相同的大小。

我也試過如下:
- 改變所有VARCHAR2列NVARCHAR2(大小相同 - VARCHAR(10)變成爲nvarchar(10))
- 出口
- 導入到新的服務器

它也工作。

不知何故後者(轉換爲nvarchar)似乎「更清潔」。然後你又有一個unicode數據庫,這個unicode數據類型看起來很奇怪。

所以問題是:是否有建議的方式去移動兩臺服務器之間的數據庫?上述兩種方法中的任何一種都有什麼嚴重問題?

回答

3

請勿使用NVARCHAR2數據類型,除非這是您唯一的選擇。國家字符集的存在是爲了處理那些不支持Unicode的現有遺留應用程序,並且您希望向系統中添加一些支持Unicode的列而不觸及那些遺留應用程序。使用NVARCHAR2列對於這些情況非常適用,但它會在應用程序開發中創建各種問題。大量工具,API和應用程序不支持NVARCHAR2列,或者需要額外的配置才能完成此操作。而且由於NVARCHAR2列在Oracle世界中相對不常見,因此花費大量時間試圖解決您遇到的特定問題非常容易。更關鍵的是,由於AL16UTF16每個字符至少需要2個字節,因此您可能需要相當多的空間,因爲您的大部分數據可能包含英文字符。

我強烈希望遷移到具有字符長度語義的新數據庫(即VARCHAR2(10 BYTE)變爲VARCHAR2(10 CHAR))。這避免了允許的長度加倍。它還使得向用戶解釋長度限制(或在前端對這些驗證進行編碼)更容易。對於大多數用戶來說,解釋某個特定列有時可以容納20個字符(僅使用英文字符時),有時可以容納10個字符(僅使用非英文字符時),並且有時可以在中間放置某些東西(當有字符混合時)。字符長度語義使所有這些問題變得非常容易。

+0

在UTF-8(即Oracle中的AL32UTF8)中,單個字符可以存儲在最多4個字節中。一個「非奇特」字符是使用UTF-8中的3字節的歐元(€)符號。 –

1

遷移到unicode數據庫是一個4步過程。

  1. 使用exp [dp]導出數據併爲表生成ddl。
  2. 改變ddl以將字節長度varchar2字段更改爲字符長度字段。
  3. 使用修改的ddl腳本創建表。
  4. 使用小鬼[DP]

跳過步驟2輸入數據和3導入過程中給你留下的字節長度定義字段一次可能與很多誤區,因爲數據不會在定義的列適合。如果源數據庫中只有我們的字符,它不會是一個大問題,但例如拉丁字符會給出問題,因爲單個字符可能需要更多的字節。

按照列出的程序可防止長度問題。顯然有更多的方法可以做到這一點,但規則是先確定ddl定義並稍後插入數據。

相關問題