У нас есть база данных Oracle со следующими настройками кодировки
Параметр SELECT, значение FROM nls_database_parameters WHERE параметр, например "NLS%CHARACTERSET"
NLS_NCHAR_CHARACTERSET: AL16UTF16
NLS_CHARACTERSET: WE8ISO8859P15
В этой базе данных у нас есть таблица с полем CLOB
, в которой есть запись, начинающаяся со следующей строки, хранящаяся, очевидно, в ISO-8859-15: X²ARB
(здесь правильно преобразовано в юникод, в частности, что 2-верхний индекс важен и правилен ).
Затем у нас есть следующий тривиальный фрагмент кода для получения значения, которое должно автоматически преобразовывать кодировку в юникод через поддержку глобализации в Oracle:
private static final String STATEMENT = "SELECT data FROM datatable d WHERE d.id=2562456";
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
try (Connection conn = DriverManager.getConnection(DB_URL);
ResultSet rs = conn.createStatement().executeQuery(STATEMENT))
{
if (rs.next()) {
System.out.println(rs.getString(1).substring(0, 5));
}
}
}
Запуск кода печатает:
- с
ojdbc8.jar
иorai18n.jar
:X�ARB
-- неверно - с
ojdbc7.jar
иorai18n.jar
:X�ARB
-- неверно - с
ojdbc-6.jar
:X²ARB
-- правильно
Используя UNISTR
и изменив оператор на SELECT UNISTR(data) FROM datatable d WHERE d.id=2562456
, я могу заставить ojdbc7.jar
и ojdbc8.jar
возвращать правильное значение, но это потребует неизвестного количества изменений в коде, поскольку это, вероятно, не единственное место, где возникает проблема.
Можно ли что-нибудь сделать с конфигурацией клиента или сервера, чтобы все запросы возвращали правильно закодированные значения без изменений оператора?
jodbc6.jr
из линейки драйверов 12.1 его поведение похоже на поведение 7 и 8. Очевидно, мы получаем правильное поведение только сjodbc-6.jar
, которое у нас было. в течение многих лет с более ранними выпусками нашего продукта. Таким образом, должно было быть изменение, затрагивающее 6 аналогично 7 и 8 :( - person Oleg Sklyar   schedule 21.03.2018