我使用具有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是一個非常標準的字符集,所以我可能會走錯路。
任何幫助將不勝感激。
正在檢索的數據是由屬於ISO-8859-15字符集的字符組成的嗎?數據是否可能包含ISO-8859-15中不存在的Windows-1252字符(例如Microsoft智能報價之類的內容)? – 2012-02-22 18:01:59
感謝您的幫助,字符串中唯一不尋常的字符應該是tilda(〜),但這是在Windows-1252和ISO-8859字符集中。不要以爲我們會使用MS智能報價,所以我認爲我可以排除這一點。 – 2012-02-22 18:07:35
將orai18n.jar添加到CP總是爲我工作,當我得到「???」 – JIV 2012-08-09 12:16:22