SQL_ASCII и Java удаленный доступ к PostgreSQL - PullRequest
0 голосов
/ 08 сентября 2010

Алло,

Я пытался отправить запрос в PostgreSQL 8.x с кодировкой символов SQL_ASCII. К сожалению, я никак не могу преобразовать его в UTF-8: ни отправку свойств соединения client_encoding = UTF8 с помощью springframework, ни "SET CLIENT_ENCODING = 'UTF8';" прямо в транзакции jdbc - ничего не помогает.

При настройке кодировки клиента в транзакции jdbc я проверил, действительно ли client_encoding установлен - да, client_encoding действительно установлен в UTF8, но следующий оператор того же сеанса возвращает мне все еще не распознанные специальные символы.

con = ds.getConnection();
con.setAutoCommit(false);
stmt = con.prepareStatement("SHOW client_encoding");
ResultSet rs = stmt.executeQuery();
 while(rs.next()){
  System.out.println(rs.getString(1)); 
  //Here is the output "UNICODE"
 }
 stmt.close();
 stmt = con.prepareStatement("SET client_encoding='UTF8'");
 stmt.execute();
 stmt.close();
 stmt = con.prepareStatement("SHOW client_encoding");
 rs = stmt.executeQuery();
 while(rs.next()){
  System.out.println(rs.getString(1)); 
  //Here is the output "UTF8"
 }
 stmt.close();
 stmt = con.prepareStatement(sql);
 ResultSet res = stmt.executeQuery();

 while(res.next()) {
  String s = res.getString("mycolumn");
  System.out.println(s);
  //The text has "?" instead of special chars
 }

Конфигурация:

<bean id="mybean" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
 <constructor-arg><value>[myurl]</value></constructor-arg>
 <constructor-arg>
  <props>
   <prop key="charSet">SQL_ASCII</prop>
   <prop key="client_encoding">UTF-8</prop> 
   <prop key="timezone">UTC</prop>
   <prop key="user">[user]</prop>
   <prop key="password">[password]</prop>
   <prop key="allowEncodingChanges">true</prop>
  </props>
 </constructor-arg>
 <property name="driverClassName"><value>org.postgresql.Driver</value></property>
</bean>

Используется PostgreSQL-драйвер: postgresql-8.4-701.jdbc4.jar

Ввод в PostgreSQL - LATIN1, также я попытался установить кодировку в LATIN1 и ISO88591 - такая же ошибка происходит.

Действительно ли теперь возможно преобразовать эту кодировку в какие-либо стандарты?

Спасибо за совет!

1 Ответ

1 голос
/ 09 сентября 2010

Решение

Я уже нашел решение. Вам следует избегать конвертации и получать непосредственно байты:

private String getSqlAscii(ResultSet res, String column) throws SQLException    {
    byte[] b = res.getBytes(column);

    if(b != null)   {
        try {
            return new String(b, "[input-encoding]");
        } catch (UnsupportedEncodingException e) {
            log.error("Wrong encoding configured", e);
        }
    }

    return null;
}

Одно важное требование: вы должны знать, что Charset использовался при вводе данных в PostgeSQL. Это слабое место SQL_ASCII

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...