JDBC讀取Oracle的US7ASCII編碼中文亂碼及不同編碼下漢字佔用位元組的問題

來源:互聯網
上載者:User

標籤:

資料庫版本號碼:Oracle 10g

字元集:SIMPLIFIED CHINESE_CHINA.US7ASCII

JDK:1.6.0_45

Oracle驅動:ojdbc14.jar

使用JDBC操作資料庫,擷取串連、運行SQL沒有問題。可是,查詢出來的結果中,全部漢字,均顯示為亂碼。

debug查看到在資料從資料庫中擷取出來的時候,就已經是亂碼,而使用PL/SQL等工具,均顯示正常。

不知是否Oracle的驅動,在進行漢文書處理的時候,使用了系統預設的字元集?此時,本著死馬當活馬醫的理念,使用下對漢字的強制轉碼,ASCII碼是標準的ISO-8859-1的子集,或許使用這個ISO-8859-1能夠擷取到正常的漢字?於是,首先測試使用new String(fieldValue.getBytes("ISO-8859-1"));輸出依舊亂碼!想想應該是將這東西進行轉碼,而不不過依照這個格式擷取,於是調整為:new String(fieldValue.getBytes("ISO-8859-1"), "GBK"),測試下,搞定!不過,全部用到漢字的地方,均須要這麼搞一下,有點麻煩。

據說,能夠使用第二種方式:改Oracle的字元集!

1、須要改動注冊表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG 的值為SIMPLIFIED CHINESE_CHINA.ZHS16GBK

2、改動一個系統變數NLS_LANG.

以上兩種,第二種方式試過,能夠。第一種,未在現有環境下做過測試。

另外,將擷取到的漢字,寫入另外一個oracle 11g的資料庫中,發現:漢字不是依照一個漢字兩個位元組來存放的;而是一個漢字3個位元組!

查了一下,發現:字元集是AL32UTF8,這個字元集一般都預設中文是3個位元組。於是,須要將目標資料庫表的欄位長度進行擴充。實際對於漢字的問題,oralce以及較新的sqlserver,都支援nvarchar的格式,對於使用nvarchar的欄位,不管漢字還是數字、字元、英文字母,均每一個字元佔用1位。

假設不確定當前一個漢字佔用幾個字元,能夠使用select length(‘汗‘) from dual;進行查看。

對於US7ASCII的字元集,眼下來看,新上的系統使用的較少了,而對於一些較老的遺留系統,可能會存在這樣的情況。詳細還需注意!

JDBC讀取Oracle的US7ASCII編碼中文亂碼及不同編碼下漢字佔用位元組的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.