2013-05-31 53 views
0

我最近遇到了一個問題,那就是我們正在運行數據遷移腳本,通過Oracle DBLink將數據從SQL Server移動到Oracle 10g。在我們的Oracle生產環境中運行腳本之前,一切正常。對於在SQL Server中定義爲tinyint的某些列,我們發現SQL Server數據庫中高於127的值現在爲負值(比原始值小256)。爲什麼腳本在開發和測試數據庫中工作,但不在生產中?當我從SQL Server中導入一個tinyint列到Oracle 10g時,爲什麼我會得到負值?

回答

4

我在問和回答我自己的問題,因爲Google和StackOverflow無法幫助我解決這個問題,至少在我使用的搜索條件方面。在我們開始研究時,我們發現SQL Server將tinyint視爲無符號字節(0到255),而Oracle將其視爲有符號字節(-128到127)。但是我們導入了NUMBER(3)列,這是合適的。編寫數據遷移腳本的人需要使用Oracle的來編號函數以讀取SQL Server tinyint列出於某種原因。因此,如果您在我們的開發和測試環境中運行它,則此查詢將在第二列中返回一些好奇的字符,但它在我們的生產環境中的兩列中都返回相同的負數。

SELECT to_number("SomeTinyIntColumn"), "SomeTinyIntColumn" 
FROM MySQ[email protected] 

我們最終發現,它在開發和測試環境中工作的原因是因爲字符集是UTF-8那裏,但在生產中,這是一個西歐8位字符集:

SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'; 
-- Dev and Test: AL32UTF8 
-- Prod: WE8ISO8859P1 

如此看來,閱讀的SQL Server TINYINT列通過DBLINK一個UTF-8字符和轉換,爲一個Oracle NUMBER(3)列的作品,您使用的是UTF-8字符集提供爲您的Oracle數據庫。如果DBLink自己處理了轉換(使得轉換爲不必要的轉換),但它看起來並不知道如何處理SQL Server tinyint

我希望這有助於別人有一天!

相關問題