Erro persistir POstgreSQL- character 0xefbfbf of encoding "UTF8" has no equivalent in "LATIN1"

8 respostas
denispoa

Olá pessoa.

Estou tentando inserir dados de uma view em uma tabela no PostgreSQL.

O procedimento é simples através de um método consulta na view, armazena em uma LIST e depois insere na tabela. mas quando vai inserir esta dando o seguinte erro:

Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbf of encoding "UTF8" has no equivalent in "LATIN1"
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:831)

Estou utilizando Glassfish, JPA2 e JSF.

A Conexão é feita através de uma PU, segue:

<?xml version="1.0" encoding="UTF-8"?>
<!-- was: <?xml version="1.0" encoding="ISO-8859"?> -->
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="GeoCorrelacaoPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>palhoca-local</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

O PostgreSQL esta configurado como LOCALE “C” e o banco usa a linguagem Latin1.

Se alguém puder me ajudar.

Agradeço a atenção de todos;

8 Respostas

Hebert_Coelho

Você não poderia alterar o colate do seu banco não? Colocar como utf-8?

denispoa

Pior que não dá, todos os bancos aqui na empresa que trabalho estão em Latin1.

Hebert_Coelho
Tem uma alteração que você pode fazer, mas que pode te ferrar caso você queria fazer uma portabilidade de bancos:

@Column(name = NAME_COL, columnDefinition = VARCHAR(250) COLLATE latin1_general_cs)

private String name;

Eu digo que pode te ferrar, pois caso sua aplicação venha mudar de banco, você teria que mudar todo seu seu código para que a declaração do COLLATE seja correta.

denispoa

Ta doido o negócio aqui.

@Column(name = "nm_pessoa_razao_social", columnDefinition = "VARCHAR(100) COLLATE latin1_general_cs") 
    private String nmPessoaRazaoSocial;

deu o Aviso/erro

: org.postgresql.util.PSQLException: ERROR: syntax error at or near "COLLATE"
Hebert_Coelho

Veja qual a sintaxe correta para o postgres. Outra coisa é que você terá que dropar caso algum campo esteja com UFT8.

denispoa

Não achei nada que funcionasse neste sentido.

Tu não saberia me dizer de onde ele tira aquele “UTF8” ali. Será que é no Glassfish? Procurei algo e não encontrei.

Hebert_Coelho

denispoa:
Não achei nada que funcionasse neste sentido.

Tu não saberia me dizer de onde ele tira aquele “UTF8” ali. Será que é no Glassfish? Procurei algo e não encontrei.


Sorry, nem idéia.

denispoa

Acho que a caca é no meu método, ali no for não estou sabendo inserir o objeto! Ai ele tenta inserir algo estranho no banco e dá o erro.

public void listaViewCorrelacao() {
        System.out.println("Listando Imóveis de Correlação.");
        imoveis = null;
        try {           
            imoveis = getFacade().getViewCorrelacao();            
            if(imoveis == null){
                nrCadastroImobiliario = 0;
            }
            System.out.println("Sucesso ao listar Imóveis de Correlacção.");
        } catch (Exception e) {
            FacesContext ctx = FacesContext.getCurrentInstance();
            ctx.addMessage(null, new FacesMessage("Erro ao listar Imóveis de Correlação: " + e.getMessage()));
            System.out.println("Erro ao ao listar Imóveis de Correlação: " + e.getMessage());
            e.printStackTrace(System.out);
        }

      for(int x = 0;x < 5;x++){
              Correlacao imovel = new Correlacao();
              imovel = imoveis.get(x);
              getFacade().create(imovel);
              System.out.println("gravando imovel: " + imoveis.get(x));                          
              
        }
}
Criado 29 de fevereiro de 2012
Ultima resposta 29 de fev. de 2012
Respostas 8
Participantes 2