JDBC Call to Oracle возвращает 3 знака вопроса - PullRequest
2 голосов
/ 22 февраля 2012

Я выполняю вызов хранимой процедуры оракула, используя JDBCTemplate, у которого есть входной / выходной параметр STRUCT.Одним из полей в этой структуре является VARCHAR, который обновляется в зависимости от логики хранимой процедуры.Однако, когда это возвращается из вызова, оно просто содержит три знака вопроса - «???».Возможно, это работа Riddler, но это больше похоже на проблему с кодировкой символов.

Это работало нормально, пока мы не переключили базы данных на базу данных, в которой была кодировка символов 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 в classpath, но безуспешно.Однако это кажется действительно необычным, учитывая, что ISO-8859 - довольно стандартная кодировка, поэтому я могу пойти по неверному пути.

Любая помощь будет принята с благодарностью.

1 Ответ

5 голосов
/ 27 февраля 2012

Это была проблема кодировки символов из-за того, что кодировка символов базы данных сохранялась как ISO-8859- 15 - версия 15 этого стандарта вызывала все проблемы, которые по сути являются добавлением символа евро. Драйвер оракула, который мы использовали для подключения через JDBC, просто не мог выполнить преобразование из ISO-8859-15 в Java UTF-16.

Возвращение к ISO-8859-1 или переключение на кодировку UTF-8 в базе данных (лучше) решает эту проблему. Возможно, что добавление jar orai18n в путь к классам может решить эту проблему, но поскольку для этого нет легкодоступного пакета OSGI, сделать это было не так легко. Моя рекомендация - вообще не связываться с базами данных Oracle.

...