2010-09-08 9 views
0

Hallo,SQL_ASCII et Java d'accès à distance à PostgreSQL

J'ai essayé d'envoyer la demande à PostgreSQL 8.x qui a le codage des caractères SQL_ASCII. Malheureusement, je ne peux pas le convertir en UTF-8 de quelque façon que ce soit: ni envoyer les propriétés de connexion client_encoding = UTF8 en utilisant springframework, ni "SET CLIENT_ENCODING = 'UTF8';" directement dans la transaction jdbc - rien n'y fait. Lors du paramétrage du codage client dans la transaction jdbc que j'ai coché, si le paramètre client_encoding est défini, oui, le paramètre client_cloding est défini dans l'UTF8, mais l'instruction suivante de la même session me renvoie des caractères spéciaux non reconnus.

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 
} 

Configuration:

<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-pilote utilisé est postgresql-8.4-701.jdbc4.jar

L'entrée dans PostgreSQL est LATIN1, je l'ai essayé en mettant également à l'encodage LATIN1 et ISO88591 - la même erreur se produit.

Est-il vraiment possible maintenant de convertir ce codage à n'importe quel standard?

Merci dans le conseil!

Répondre

1

Solution

Je trouve allready la solution. Vous devez éviter la conversion et obtenir directement les octets:

 
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; 
} 

Une condition importante: vous devez savoir, quel jeu de caractères a été utilisé sur l'entrée de données dans le PostgeSQL. C'est le point faible de SQL_ASCII

+0

Ceci n'est pas une solution. C'est une solution de contournement. Cela rend les données totalement non portables. – BalusC

+0

Une solution de contournement est mieux que rien. Je suis d'accord, ce n'est pas génial, mais je pense qu'un vote négatif est un peu dur. J'ai trouvé sa réponse utile quand je l'ai trouvé. – sillyMunky