Problema de acentuação Java + MySQL

Olá pessoal, primeiramente peço desculpas por pegar no pé com essa questão tão discutida por aí, mas não estaria postando caso realmente não estivesse conseguindo resolver este problema.
Não faço ideia se este problema é comum ou não, mas já tentei todas as possíveis soluções que encontrei em outros tópicos que diziam este erro ser bem comum e não tive muito progresso.
Bom, o negócio é o seguinte: tou desenvolvendo uma aplicação Java Web usando o banco de dados MySQL, fiz diversos testes para entender o que está acontecendo:

Deixei a instância do MySQL e meu banco de dados totalmente latin1, chequei as variaveis do MySQL:

character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results latin1
character_set_server latin1
character_set_system utf8

collation_connection latin1_swedish_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci

Dessa forma, eu consigo inserir registros com caractere especial sem problemas pelo MySQL Command Line, ficam perfeitamente definidos os acentos, porém, pelo software caso eu insira um registro como “Ç” no MySQL fica registrado como um caractere estranho, mas consigo retornar o mesmo registro para o software, e ele retornar “Ç” e o registro que foi registrado perfeitamente diretamente pelo Command Line retorna um caractere estranho. Conclusão: algo está convertendo os caracteres especiais no caminho software-banco.

Não parece o ideal para mim, mas tudo bem, me conformei com a ideia do banco de dados ficar errado, desde que o retorno visual do registro esteja correto.

Porém aí chega o problema: na hora de fazer backup do banco de dados, usando o mysqldump, acontece algo estranho: ele gera o arquivo de backup “traduzindo” os caracteres estranhos que retornam corretamente visualmente. Ou seja, o que antes era um caractere estranho no banco de dados, mas que no software aparecia como “Ç” agora está como “Ç” no banco, e no software ele aparece um caractere estranho.

Bom, daí eu tentei forcar o character set para latin1 no backup:

mysqldump -u root --databases --default-character-set=latin1 projeto > C:\BackupProjeto.sql

Porém da na mesma.

Tentei reconfigurar a instancia do mysql (deletar e criar uma nova) tudo como utf-8, e deu na mesma.

Então, uma possível solução seria fazer o MySQL gerar o backup EXATAMENTE como consta em seus registros, sem converter nada, ou identificar o que está convertendo esses caracteres entre o caminho software-banco e tentar solucionar.

Não, estou usando apenas o console do java para esses testes, assim fatores como page encoding ficam fora de questão.

Acredito que isso vai ajudar muita gente, porque já perguntei para várias pessoas e elas tinham a mesma dúvida que eu.

Obrigado desde já!

eu faço assim:
C:
cd pasta programa mysql
mysqldump -u root -p meu_banco > C:\BackupdoBanco.sql
ou
mysqldump -u root --password=senha > C:\BackupdoBanco.sql

tirando acentuação:
UPDATE tabela SET campo4 = REPLACE(campo4, ‘Ã’, ‘A’);

[quote=Lindberg]eu faço assim:
C:
cd pasta programa mysql
mysqldump -u root -p meu_banco > C:\BackupdoBanco.sql

mysqldump -u root --password=senha > C:\BackupdoBanco.sql
[/quote]

Sim, mas a questão não é essa… o problema refere-se aos caracteres especiais =|

ta no linux, olha esse link: http://frankley.wordpress.com/2008/06/04/mudar-de-utf8-para-iso-8859-1-no-ubuntu/

Tou usando windows xp mesmo :s

uma duvida qual a versao do mysql que vc estar usando ?

use uma versao mais recente apartir de 5.1.xx.
acho que resolve.

[quote=Lindberg]uma duvida qual a versao do mysql que vc estar usando ?

use uma versao mais recente apartir de 5.1.xx.
acho que resolve.
[/quote]

usando a 5.1 =|

Ola chimufox e Lindberg,
pelo que eu entedi o problema não é o mysql, pois ao que parece ele registra direitinho o “ç” “~”, então o problema deve ser, como o chimufox sugeriu, entre a aplicação e o banco. Bom não da para ter certeza sem o panorama melhor. O que vc ta usando para persistir? Hiberante?

[quote=Hulkmarciano]Ola chimufox e Lindberg,
pelo que eu entedi o problema não é o mysql, pois ao que parece ele registra direitinho o “ç” “~”, então o problema deve ser, como o chimufox sugeriu, entre a aplicação e o banco. Bom não da para ter certeza sem o panorama melhor. O que vc ta usando para persistir? Hiberante? [/quote]

Não, meu projeto tá simples de tudo, tou usando só o padrão dao…

package dao;

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Conexao {

    private String usuario = "root";
    private String senha = "";
    private String banco = "gerenciamento";
    private String url = "jdbc:mysql://localhost:3306/" + banco ;
    private Connection conexao = null;

    public Conexao() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection(url, usuario, senha );
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch (ClassNotFoundException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public Connection getConexao() {
        return conexao;
    }
}
public class ProdutoDAO {

    private Connection conexao = null;

    public ProdutoDAO() {
        conexao = new Conexao().getConexao();
    }

    //inserindo um caractere especial no banco
    public static void main(String[] args) {
        Produto p = new Produto();
        p.setCfop(1111);
        p.setDescricao("ANTÔNIO");
        p.setValor(1111);
        p.setEstoque(1);
        
        //no banco, ficará registrado como um caractere estranho
        new ProdutoDAO().inserir(p);
        
        //porém, ao listar ele retorna como foi digitado: "ANTÔNIO"
        List<Produto> lista = new ProdutoDAO().getLista();
        for(Produto p2 : lista){
            System.out.println(p2.getDescricao());
        }
    }

    public void inserir(Produto produto) {
        String sql = "insert into produto(pro_cfop,"
                + "pro_descricao, pro_valor, pro_estoque) values (?,?,?,?)";
        try {
            PreparedStatement ps = conexao.prepareStatement(sql);
            ps.setInt(1, produto.getCfop());
            ps.setString(2, produto.getDescricao().toUpperCase());
            ps.setDouble(3, produto.getValor());
            ps.setInt(4, produto.getEstoque());
            ps.execute();
            System.out.println("inserido");
        } catch (SQLException e) {
            System.out.println("Erro ao inserir: " + e.getMessage());
        }
    }

    public List<Produto> getLista() {
        String sql = "select * from produto";
        List<Produto> lista = new ArrayList<Produto>();
        try {
            PreparedStatement ps = conexao.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Produto produto = new Produto();
                produto.setCodigo(rs.getInt("pro_codigo"));
                produto.setCfop(rs.getInt("pro_cfop"));
                produto.setValor(rs.getDouble("pro_valor"));
                produto.setDescricao(rs.getString("pro_descricao"));
                produto.setDisponivel(rs.getBoolean("pro_disponivel"));
                produto.setEstoque(rs.getInt("pro_estoque"));
                lista.add(produto);
            }
            System.out.println("listado");
        } catch (SQLException e) {
            System.out.println("Erro ao listar: " + e.getMessage());
        }
        return lista;
    }
}

ps. Estou usando a biblioteca do netbeans 6.9.1: MySQL JDBC Driver - mysql-connector-java-5.1.6-bin.jar e o MySQL versão 5.1.54

ola,

fiz uns teste aqui e no banco ficou:

+----+------+-----------+---------+
| id | cfop | descricao | valor   |
+----+------+-----------+---------+
|  1 | 1111 | ANTÈNIO   | 1111.00 |
+----+------+-----------+---------+
1 row in set (0.00 sec)

Contudo o resultado que retorna no console do netbeans é:

inserido
listado
ANTÔNIO

No seu tbm aparece assim no console?

A versão que utilizo é um pouco mais nova: MySQL JDBC Driver - mysql-connector-java-5.1.14-bin.jar. Baixe a versão mais recente para ver se resolve.

[quote=Hulkmarciano]ola,

fiz uns teste aqui e no banco ficou:

+----+------+-----------+---------+
| id | cfop | descricao | valor   |
+----+------+-----------+---------+
|  1 | 1111 | ANTÈNIO   | 1111.00 |
+----+------+-----------+---------+
1 row in set (0.00 sec)

Contudo o resultado que retorna no console do netbeans é:

inserido
listado
ANTÔNIO

No seu tbm aparece assim no console?

A versão que utilizo é um pouco mais nova: MySQL JDBC Driver - mysql-connector-java-5.1.14-bin.jar. Baixe a versão mais recente para ver se resolve.[/quote]

Obrigado por tentar ajudar Hulk, acontece a mesma coisa aqui (exatamente a mesma) o caractere fica registrado como è no MySQL.

Porém, o problema não está em exibir para o usuário, está em gerar o backup: quando eu gero o backup usando mysqldump, ele converte esse “è” para outro caractere, daí quando tento restaura-lo, o registro volta visualmente errado pro software. Já tentei forcar o dump com --default-character-set=latin1 e utf8, mas ele converte os caracteres de uma forma ou outra… eu só queria que ele deixasse exatamente como está D=

Nesse caso o problema é só do mysql, vc pode colocar o que vc quiser nas telas e nada vai resolver. Não tenho muitos conhecimentos em mysql e infelizmente não posso te ajudar nesse caso.

neste caso, depois de tudo q vc falou …
formata e instala xp novamente …
pode ter algum bug
t+

Não exatamente, uma possível solução seria fazer o charset do java entrar em “sincronia” com o mysql, se eu conseguisse fazer um registro do mysql “Antônio” voltar como “Antônio” pro java, o problema tá resolvido.

O correto seria arrumar um jeito de fazer o mysql salvar o bendito “ô” ao invéns de “è”. Não entendi uma coisa: ele retorna errado na aplicação java tbm ou só depois do dump?

Então Hulk, é isso que acontece mesmo, o musqldump salva o ô no lugar do è, mas eu nao quero que aconteca isso, pois estando “ô” no mysql, na aplicacao java ele retorna um caractere estranho!

ele só retorna errado depois do dump, porque o dump conserta os caracteres