2012-02-22 49 views
2

我使用具有STRUCT的輸入/輸出參數的JDBCTemplate調用Oracle存儲過程。此結構中的一個字段是VARCHAR,它根據存儲過程邏輯進行更新。然而,當它從通話返回時,它只包含三個問號 - '???'。這可能是Riddler的工作,但它聽起來更像是一個char編碼問題。對Oracle的JDBC調用返回3個問號

這工作得很好,直到我們切換數據庫到具有WE8ISO8859P15(ISO8859)的字符編碼這是做檢索的數據庫:

SELECT NLS_CHARACTERSET FROM NLS_DATABASE_PARAMETERS 

先前工作的字符集爲WE8MSWIN1252(MSWIN-1252),它工作正常。所以我猜這是由於字符集問題,儘管我有點謹慎,因爲它總是隻返回3個問號,而不管應該返回多少文本。

據我瞭解,底層JDBC驅動程序(jdbc:oracle:thin)會自動執行所有字符編碼,並將數據庫字符集轉換爲UTF-16(Java字符編碼),但看起來不會發生。我使用StoredProcedure類(Spring的一部分)調用StoredProcedure。

我也嘗試添加orai18n.jar到類路徑,但沒有成功。然而,考慮到ISO-8859是一個非常標準的字符集,所以我可能會走錯路。

任何幫助將不勝感激。

+0

正在檢索的數據是由屬於ISO-8859-15字符集的字符組成的嗎?數據是否可能包含ISO-8859-15中不存在的Windows-1252字符(例如Microsoft智能報價之類的內容)? – 2012-02-22 18:01:59

+0

感謝您的幫助,字符串中唯一不尋常的字符應該是tilda(〜),但這是在Windows-1252和ISO-8859字符集中。不要以爲我們會使用MS智能報價,所以我認爲我可以排除這一點。 – 2012-02-22 18:07:35

+2

將orai18n.jar添加到CP總是爲我工作,當我得到「???」 – JIV 2012-08-09 12:16:22

回答

4

由於數據庫字符編碼存儲爲ISO-8859- - 本標準的第15版引起的所有問題基本上都是歐元符號的增加,所以這是一個字符編碼問題。我們用來通過JDBC連接的oracle驅動程序根本無法完成從ISO-8859-15到Java的UTF-16的轉換。

恢復回ISO-8859-1或更改爲數據庫上的UTF-8編碼(更好)可以解決此問題。將orai18n jar添加到類路徑中可能會解決這個問題,但由於沒有可用的OSGI包,因此不太容易。我的建議是不要打擾Oracle數據庫。

+1

我們遇到了同樣的問題,並添加了orai18n jar解決了問題! – tom 2013-11-14 13:43:29

+0

在JBoss(Wildfly)上,我必須將ora18n.jar添加到服務器模塊:jboss-wildfly-8.1.0 \ modules \ com \ oracle \ ojdbc6 \ main。不要忘記將它包含在module.xml中: mvermand 2016-01-25 14:09:44