2011-03-14 67 views
4

我有一個表中,我們的服務提供商插入UNICODE數據,但我的oracle字符集是WE8ISO8859P1。如何轉換在Oracle中的列的字符集

現在得到的數據我使用了oracle的以下功能,但它顯示???????從client_campaigns

選擇轉換(消息, 'AL32UTF8', 'WE8ISO8859P1')

一個件事多個消息coulmn是CLOB類型。

由於dataloss,我不能改變我的數據庫的字符集,第二,它的生產和字符集中的變化可能導致錯誤。

現在請指導我如何以UNICODE的形式獲取這些數據?

問候, 姆蘭

回答

7

字符串插入的字符(或VARCHAR2 CHAR或CLOB)柱將總是被轉換爲數據庫的字符集。這意味着插入的數據將轉換爲WE8ISO8859P1。由於UNICODE不是WE8ISO8859P1的子集,因此您將失去信息。在插入時,字符集中不可用的某些字符會轉換爲?

你應該怎麼做?新數據有兩種選擇:

  1. 將列的數據類型修改爲NVARCHAR2而不是VARCHAR2(或NCLOB而不是CLOB)。 NVARCHAR2是專門設計的,因此您可以在不修改主分貝字符集的情況下處理多字節字符。有關VARCHAR2和NVARCHAR2之間的差異,請參閱this SO question)。也請注意,某些應用程序may not work correctly with NVARCHAR2
  2. 您可以將列修改爲RAW或BLOB,並將您的字符串直接寫入二進制流。當您再次閱讀時,它仍然是UNICODE數據。然而,數據庫很難對這個列數據做任何事情:排序將是二進制的,搜索將是有問題的,因爲您將無法正確使用LIKE運算符。
  3. 如果你有很多的UNICODE輸入,你可以考慮修改你的數據庫字符集。這將是最昂貴的選項(您可能需要導出/重新安裝/導入),但之後所有列都將具有正確的數據類型。

如果給出選擇,我會選擇(1)或(3)。使用RAW會禁用很多功能並增加複雜性。

顯然以前的數據將無法恢復,只有數據可用的數據:您將不得不重新導入舊結構中的舊數據。

+0

RAW是替代BLOB的較小值 – 2011-03-14 22:28:46

+0

@Gary:是的,RAW將是VARCHAR列的二進制等價物,我沒有想過這一點。不過,我不確定我的建議是使用UTF8 BLOB(或RAW)是一個好主意:) – 2011-03-15 08:29:44

相關問題