2013-08-20 37 views
13

我們正在將一些數據從sql server遷移到oracle。對於在SQL服務器中定義爲NVARCHAR的列,我們開始在Oracle中創建NVARCHAR列,認爲它們是相似的。但看起來它們不是。Oracle和SQL Server中的NVARCHAR之間的區別?

我已經閱讀了幾個關於stackoverflow的帖子,並且想確認我的發現。

如果數據庫字符集是AL32UTF8(這對我們的情況是正確的),Oracle VARCHAR2已經支持unicode。

SQLServer VARCHAR不支持unicode。支持unicode。 SQLServer明確要求欄位爲NCHAR/NVARCHAR類型以將數據存儲在Unicode(特別是2字節的UCS-2格式)中。

因此,說SQL Server NVARCHAR列可以/應該作爲Oracle遷移/應該遷移VARCHAR2列?

+0

Microsoft確認Oracle NVARCHAR2 <==> SQLServer NVARCHAR..But我想確認的是Oracle VARCHAR2 <==> SQLServer NVARCHAR? (如oracle VARCHAR2已準備好unicode) – Zenil

回答

22

是的,如果您的Oracle數據庫是使用Unicode字符集創建的,則SQL Server中的NVARCHAR應該遷移到Oracle中的VARCHAR2。在Oracle中,存在NVARCHAR數據類型以允許應用程序在數據庫字符集不支持Unicode時使用Unicode字符集存儲數據。

然而,在遷移時要注意的一件事是字符長度語義。在SQL Server中,NVARCHAR(20)爲20個字符分配空間,在UCS-2中最多需要40個字節。在Oracle中,默認情況下,VARCHAR2(20)分配20個字節的存儲空間。在AL32UTF8字符集中,可能只有6個字符的空間,儘管它很可能處理更多(AL32UTF8中的單個字符需要1到3個字節)。您可能希望將您的Oracle類型聲明爲VARCHAR2(20 CHAR),這表示您想要爲20個字符分配空間,而不管需要多少字節,這比通常容易解釋爲什麼要允許20個字符的字符串被允許,而其他10個字符串被拒絕。會話級別的默認長度語義,以便您創建的任何表格不指定任何長度語義將使用字符而不是字節語義

ALTER SESSION SET nls_length_semantics=CHAR; 

每次定義新列時都可以避免輸入CHAR。也可以在系統級別設置,但NLS團隊不鼓勵這樣做 - 顯然,並非Oracle提供的所有腳本都已針對已更改NLS_LENGTH_SEMANTICS的數據庫進行了全面測試。可能很少有第三方腳本。

+0

很好的回答......我有幾個問題。當我們真正進行遷移時,我們應該關心數據截斷問題嗎?假設我們將所有Oracle列創建爲VARCHAR2。然後,來自SQL Server VARCHAR列的任何數據都應該正確遷移。那麼來自SQL Server NVARCHAR coumn的數據呢? SQL Server NVARCHAR將數據存儲在UTF-16中,而oracle VARCHAR2則是UTF-8。遷移工具應該以某種方式照顧這個?請將您的想法添加到主要答案中。 – Zenil

+1

@Zenil - 我相信我已經在我的回答中介紹了這一點。假設在Oracle中定義列時使用字符長度語義,則Oracle'varchar2(20 char)'和SQL Server'nvarchar(20)'將分別具有20個字符的空間。如果它們每個都有20個字符的空間,則不需要擔心截斷問題。 –

+0

我認爲你解決了截斷問題,但沒有解決編碼問題。 SQL Server NVARCHAR列使用UTF-16編碼,而oracle VARCHAR2列使用UTF-8編碼。所以我想遷移工具應該意識到這一點並做適當的轉換。當我們到達這個階段時,我應該會發現這一點.. – Zenil

相關問題