conexão ao mysql via codigo java em latin1

turma to com problemas na conexao via codigo java com o mysql acho que problema é o sequinte. Acho que o JDBC por padrão se conecta como UTF-8. olha so o arquivo “my.ini” do mysql server 5.1.

OBS: Ao longo das expecificações das configurações do mysql e codigo java e sql que to mostrando tenho comentarios no final com explicações do que ja tentei.

[client]

default-character-set=latin1
port=3306

[mysql]
default-character-set=latin1

SERVER SECTION

----------------------------------------------------------------------

The following options will be read by the MySQL Server. Make sure that

you have installed the server correctly (see above) so it reads this

file.

[mysqld]

The TCP/IP Port the MySQL Server will listen on

port=3306

#Path to installation directory. All paths are usually resolved relative to this.
basedir=“C:/Program Files/MySQL/MySQL Server 5.1/”

#Path to the database root
datadir=“C:/ProgramData/MySQL/MySQL Server 5.1/Data/”

The default character set that will be used when a new schema or table is

created and no character set is defined

default-character-set=latin1

The default storage engine that will be used when create new tables when

default-storage-engine=INNODB

Set the SQL mode to strict

sql-mode=“STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

ta tudo como latin1 mas tenho problemas com carateres especiais como acentos e “ç”, até meu banco ta todo como latin1
seque o ecript SQL do meu banco.

CREATE DATABASE avaliacao CHARACTER SET = 'LATIN1';

USE avaliacao;

CREATE TABLE questoes (

  id_questao INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  questao NVARCHAR(100) NOT NULL,
  avaliacao NCHAR(1) NOT NULL
  
) CHARACTER SET LATIN1;

CREATE TABLE votantes (

  nome NVARCHAR(30) NOT NULL

) CHARACTER SET LATIN1;

CREATE TABLE cursos (

  id_curso INTEGER  NOT NULL PRIMARY KEY AUTO_INCREMENT,
  nome NVARCHAR(30) NOT NULL

) CHARACTER SET LATIN1;

CREATE TABLE professores (

  id_professor INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  nome NVARCHAR(30) NOT NULL,
  local_trabalho NVARCHAR(30) NOT NULL,
  carga_horia SMALLINT NOT NULL,
  periodo DATE NOT NULL  
  
) CHARACTER SET LATIN1;

CREATE TABLE diciplinas(

  id_diciplina INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_professor INTEGER NOT NULL REFERENCES professores(id_professor),
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  nome NVARCHAR(30) NOT NULL,
  credito SMALLINT,
  carga_horaria SMALLINT

) CHARACTER SET LATIN1;

CREATE TABLE votos (

  id_voto INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_questao INTEGER NOT NULL REFERENCES questoes(id_questao),
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  id_professor INTEGER REFERENCES professores(id_professor),
  item NCHAR(1) NOT NULL
    
) CHARACTER SET LATIN1;

como estar tudo como latin1 pensei que foce o collation então comecei a especificar outros colletion na query. Foi ai que pecebi o problema estava conectado como UTF-8, pois foi gerado uma SQLExeption com uma mensagem de erro que dizia que este collation não existia paro o character set UTF-8. Entam foi que pecebi que devia ser o JDBC que estar se conectando ao banco como UTF-8. sequi a minha classe que cria a conexão com o banco. ja especifique o charset na url de conexão, tambem executei
SET CHARACTER SET LATIN1 no banco antes de executar uma query via codigo java mas o problema pessiste. Tuma precisso resolver isso o mais rapido possivel ou etou ferrado na minha iniciação cientifica jr. preciso disso funcionando perfeitamente logo. ja fiz atualização de driver to usando o driver que baxei semana passada “mysql-connector-java-5.1.10-bin.jar”.

URL=jdbc:mysql://localhost/avaliacao?charset=latin1

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package aplicativo.iniciacao.cientifica.jr.sql;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

/**
*

  • @author antoniel
    */
    public class ConnectionSQL {

    /**Especifica a classe do jdbc driver mysql connector. */
    public static String MySQL_DRIVER = “com.mysql.jdbc.Driver”;

    /**Especifica a classe do jdbc driver postgreSQL connector. */
    public static String POSTGRESQL_DRIVER = “org.postgresql.Driver”;

    /**Especifica a classe do jdbc driver oracle connector. */
    public static String ORACLE_DRIVER = “oracle.jdbc.OracleDriver”;

    /**Especifica a classe do jdbc driver DB2 connector. */
    public static String DB2_DRIVER = “COM.ibm.db2.jdbc.net.DB2Driver”;

    /**Especifica a classe do jdbc driver sybase connector. */
    public static String SyBASE_DRIVER = “com.Sybase.jdbc.SyDriver”;

    private Connection conexao;

    private Statement execut;

    private boolean conexaoComDataBase;

    private ResultSet resultSet;

    private ResultSetMetaData metaData;

    private int numeroLinha;

    /**Construtur com quatro argumentos, cria a conexão com o banco de dados devolvendo qualquer SQLException

    • gerada durante o estabelecimento da conexão, devolve uma ClassNotFoundException caso a classe de driver
    • não seja encontrada.
      */

    public ConnectionSQL(String driver,String url_banco,String usuario,String senha) throws ClassNotFoundException, SQLException{
    Class.forName(driver);//carega a classe de driver
    conexao = DriverManager.getConnection(url_banco, usuario, senha);//conecta-se ao banco
    //cria o statement para consutar o banco
    execut = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    conexaoComDataBase = true;//configura a conexão
    }

    public ConnectionSQL(String driver,String home) throws ClassNotFoundException, SQLException{

    }

    /**Executa uma consulta no banco de dados de acordo com a SQL passada como argumento. */

    public void executQuery(String query) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     resultSet = execut.executeQuery(query);
     metaData = resultSet.getMetaData();
     resultSet.last();//move o cursor para a utima linha
     numeroLinha = resultSet.getRow();
    

    }

    /**Executa uma atualização no banco de dados de acordo com a SQL passada como argumento. */

    public void executUpdate(String SQLUpdate) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     execut.executeUpdate(SQLUpdate);
    

    }

    /**Executa um comando SQL no banco de dados retornando uma int com o status da execução. */
    public int executComando(String cmd) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     return execut.executeUpdate(cmd);
    

    }

    /**Retorna o número de linha de consutadas no banco de dados. */

    public int getNumeroLinha()throws IllegalStateException{
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     return numeroLinha;
    

    }

    /**Retorna o número de colunas selecionadas no banco de dados. */

    public int getNumeroColuna() throws SQLException,IllegalStateException,NullPointerException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

      if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return metaData.getColumnCount();
    

    }

    /**Retorna o nome da coluna de acordo com o indice especificado. */

    public String getNomeColuna(int coluna) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

       if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return metaData.getColumnName(coluna);
    

    }

    /**Retorna um objeto Class para a coluna indicada. */

    public Class getColunaClass(int coluna) throws SQLException,ClassNotFoundException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

       if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return Class.forName(metaData.getColumnClassName(coluna));
    

    }

    /**Retorna um Object para o valor do banco de dados especificado pela linha e coluna. */

    public Object getValor(int linha, int coluna) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

        if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     resultSet.absolute(linha);
     return resultSet.getObject(coluna);
    

    }

    public InputStream getAsii(int index) throws SQLException {
    return resultSet.getAsciiStream(index);
    }

    /**Retorna um int representando o tipo de dado SQL da coluna. */

    public int getTipoColuna(int coluna) throws SQLException {
    return metaData.getColumnType(coluna);
    }

    /**Fecha a conexão com o banco de dados. */

    public void fecheConnection() throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     conexao.close();
     execut.close();
     conexaoComDataBase = false;
    

    }

    /*Retorna o objeto Connection com a conexão de banco de dados/
    public Connection getConexao() {
    return conexao;
    }

    public void setConexao(Connection conexao) {
    this.conexao = conexao;
    }

    /**Retorna true se conectado com banco de dados */
    public boolean isConectadoComDataBase() {
    return (!conexaoComDataBase) ? false : true;
    }

    public Statement getExecut() {
    return execut;
    }

    public void setExecut(Statement execut) {
    this.execut = execut;
    }

    public ResultSetMetaData getMetaData() {
    return metaData;
    }

    public void setMetaData(ResultSetMetaData metaData) {
    this.metaData = metaData;
    }

    public ResultSet getResultSet() {
    return resultSet;
    }

    public void setResultSet(ResultSet resultSet) {
    this.resultSet = resultSet;
    }

}//fim da class[/code]

Já tive problemas parecidos… encoding é um saco… mas enfim, vc pode tentar as seguintes coisas:

ao invés de usar latin1, use ISO-8859-1 (é a mesma coisa, só q o segundo nome é o padrão).

PS: não conheço mySql, mas deve ser a mesma coisa do oracle… qq coisa, só adapte.

Abra um client mysql e faça select de dados com caractere especial. Verifique se vem corretamente. Se vier, o problema está no código java.

Se o problema estiver no java, faça o seguinte: verifique o encoding do seu código fonte e altere-o para ISO-8859-1 (uma coisa q eu aprendi é trabalhar sempre com apenas 1 encoding no projeto todo, isso evita muita dor d cabeça lá na frente). Após fazer a alteração do fonte (properties->resource->file text encoding no eclipse), feche o fonte e reabra-o. E verifique se há caracteres acentuados quebrados e os corrija.

Após isso, teste.

sim cara no console funciona beleza o problema ta no codigo sem duvida. Mas to usando o netbeans como eu faço para mudar o encondig nele.

No netbeans é um pouco mais fácil (ou não). Ele permite alterar o encoding lá nas propriedades do projeto. Alterando lá, ele altera em TODOS os arquivos do projeto. O padrão de encoding do Netbeans é UTF-8.

Lembre-se: se vc escreveu todos os seus códigos em UTF-8, mudá-lo irá causar problemas em todos os códigos fontes que possuam acentos (vc terá q alterá-los manualmente ou usar o iconv, que funciona em linux ou com o cygwin).

Se a base do projeto for nova ou pequena, eu recomendo alterar a base de dados p/ UTF-8, pois o UTF-8 já se tornou padrão a algum tempo em diversos locais.

rapaz cara antes de eu ver a tua dica aqqui no forum eu ja tinha consequido, valeu. e isso mesmo. estar nas propriedades do projeto e realmente os acentos no codigo fica todo bagunçãdo. cara agora uma coisa que eu não entedi como é que alterando o encoding dos codigo fontes acabou o meu problema de exibição de caracteres acentudos. cara valeu mesmo pela ajuda.

cara to estudando oracle mas to todo enrolado ele muito diferente do mysql e postgresql, se der para me da uma ajuda com ele fico grato

meu e-mail: ajinfortec@gmail.com

[quote=ajinfotec]turma to com problemas na conexao via codigo java com o mysql acho que problema é o sequinte. Acho que o JDBC por padrão se conecta como UTF-8. olha so o arquivo “my.ini” do mysql server 5.1.

OBS: Ao longo das expecificações das configurações do mysql e codigo java e sql que to mostrando tenho comentarios no final com explicações do que ja tentei.

[client]

default-character-set=latin1
port=3306

[mysql]
default-character-set=latin1

SERVER SECTION

----------------------------------------------------------------------

The following options will be read by the MySQL Server. Make sure that

you have installed the server correctly (see above) so it reads this

file.

[mysqld]

The TCP/IP Port the MySQL Server will listen on

port=3306

#Path to installation directory. All paths are usually resolved relative to this.
basedir=“C:/Program Files/MySQL/MySQL Server 5.1/”

#Path to the database root
datadir=“C:/ProgramData/MySQL/MySQL Server 5.1/Data/”

The default character set that will be used when a new schema or table is

created and no character set is defined

default-character-set=latin1

The default storage engine that will be used when create new tables when

default-storage-engine=INNODB

Set the SQL mode to strict

sql-mode=“STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

ta tudo como latin1 mas tenho problemas com carateres especiais como acentos e “ç”, até meu banco ta todo como latin1
seque o ecript SQL do meu banco.

CREATE DATABASE avaliacao CHARACTER SET = 'LATIN1';

USE avaliacao;

CREATE TABLE questoes (

  id_questao INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  questao NVARCHAR(100) NOT NULL,
  avaliacao NCHAR(1) NOT NULL
  
) CHARACTER SET LATIN1;

CREATE TABLE votantes (

  nome NVARCHAR(30) NOT NULL

) CHARACTER SET LATIN1;

CREATE TABLE cursos (

  id_curso INTEGER  NOT NULL PRIMARY KEY AUTO_INCREMENT,
  nome NVARCHAR(30) NOT NULL

) CHARACTER SET LATIN1;

CREATE TABLE professores (

  id_professor INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  nome NVARCHAR(30) NOT NULL,
  local_trabalho NVARCHAR(30) NOT NULL,
  carga_horia SMALLINT NOT NULL,
  periodo DATE NOT NULL  
  
) CHARACTER SET LATIN1;

CREATE TABLE diciplinas(

  id_diciplina INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_professor INTEGER NOT NULL REFERENCES professores(id_professor),
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  nome NVARCHAR(30) NOT NULL,
  credito SMALLINT,
  carga_horaria SMALLINT

) CHARACTER SET LATIN1;

CREATE TABLE votos (

  id_voto INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
  id_questao INTEGER NOT NULL REFERENCES questoes(id_questao),
  id_curso INTEGER NOT NULL REFERENCES curso(id_curso),
  id_professor INTEGER REFERENCES professores(id_professor),
  item NCHAR(1) NOT NULL
    
) CHARACTER SET LATIN1;

como estar tudo como latin1 pensei que foce o collation então comecei a especificar outros colletion na query. Foi ai que pecebi o problema estava conectado como UTF-8, pois foi gerado uma SQLExeption com uma mensagem de erro que dizia que este collation não existia paro o character set UTF-8. Entam foi que pecebi que devia ser o JDBC que estar se conectando ao banco como UTF-8. sequi a minha classe que cria a conexão com o banco. ja especifique o charset na url de conexão, tambem executei
SET CHARACTER SET LATIN1 no banco antes de executar uma query via codigo java mas o problema pessiste. Tuma precisso resolver isso o mais rapido possivel ou etou ferrado na minha iniciação cientifica jr. preciso disso funcionando perfeitamente logo. ja fiz atualização de driver to usando o driver que baxei semana passada “mysql-connector-java-5.1.10-bin.jar”.

URL=jdbc:mysql://localhost/avaliacao?charset=latin1

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package aplicativo.iniciacao.cientifica.jr.sql;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

/**
*

  • @author antoniel
    */
    public class ConnectionSQL {

    /**Especifica a classe do jdbc driver mysql connector. */
    public static String MySQL_DRIVER = “com.mysql.jdbc.Driver”;

    /**Especifica a classe do jdbc driver postgreSQL connector. */
    public static String POSTGRESQL_DRIVER = “org.postgresql.Driver”;

    /**Especifica a classe do jdbc driver oracle connector. */
    public static String ORACLE_DRIVER = “oracle.jdbc.OracleDriver”;

    /**Especifica a classe do jdbc driver DB2 connector. */
    public static String DB2_DRIVER = “COM.ibm.db2.jdbc.net.DB2Driver”;

    /**Especifica a classe do jdbc driver sybase connector. */
    public static String SyBASE_DRIVER = “com.Sybase.jdbc.SyDriver”;

    private Connection conexao;

    private Statement execut;

    private boolean conexaoComDataBase;

    private ResultSet resultSet;

    private ResultSetMetaData metaData;

    private int numeroLinha;

    /**Construtur com quatro argumentos, cria a conexão com o banco de dados devolvendo qualquer SQLException

    • gerada durante o estabelecimento da conexão, devolve uma ClassNotFoundException caso a classe de driver
    • não seja encontrada.
      */

    public ConnectionSQL(String driver,String url_banco,String usuario,String senha) throws ClassNotFoundException, SQLException{
    Class.forName(driver);//carega a classe de driver
    conexao = DriverManager.getConnection(url_banco, usuario, senha);//conecta-se ao banco
    //cria o statement para consutar o banco
    execut = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    conexaoComDataBase = true;//configura a conexão
    }

    public ConnectionSQL(String driver,String home) throws ClassNotFoundException, SQLException{

    }

    /**Executa uma consulta no banco de dados de acordo com a SQL passada como argumento. */

    public void executQuery(String query) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     resultSet = execut.executeQuery(query);
     metaData = resultSet.getMetaData();
     resultSet.last();//move o cursor para a utima linha
     numeroLinha = resultSet.getRow();
    

    }

    /**Executa uma atualização no banco de dados de acordo com a SQL passada como argumento. */

    public void executUpdate(String SQLUpdate) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     execut.executeUpdate(SQLUpdate);
    

    }

    /**Executa um comando SQL no banco de dados retornando uma int com o status da execução. */
    public int executComando(String cmd) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     return execut.executeUpdate(cmd);
    

    }

    /**Retorna o número de linha de consutadas no banco de dados. */

    public int getNumeroLinha()throws IllegalStateException{
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     return numeroLinha;
    

    }

    /**Retorna o número de colunas selecionadas no banco de dados. */

    public int getNumeroColuna() throws SQLException,IllegalStateException,NullPointerException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

      if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return metaData.getColumnCount();
    

    }

    /**Retorna o nome da coluna de acordo com o indice especificado. */

    public String getNomeColuna(int coluna) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

       if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return metaData.getColumnName(coluna);
    

    }

    /**Retorna um objeto Class para a coluna indicada. */

    public Class getColunaClass(int coluna) throws SQLException,ClassNotFoundException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

       if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     return Class.forName(metaData.getColumnClassName(coluna));
    

    }

    /**Retorna um Object para o valor do banco de dados especificado pela linha e coluna. */

    public Object getValor(int linha, int coluna) throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

        if(metaData == null)
         throw new NullPointerException("Nenhuma query foi efetuada ainda");
    
     resultSet.absolute(linha);
     return resultSet.getObject(coluna);
    

    }

    public InputStream getAsii(int index) throws SQLException {
    return resultSet.getAsciiStream(index);
    }

    /**Retorna um int representando o tipo de dado SQL da coluna. */

    public int getTipoColuna(int coluna) throws SQLException {
    return metaData.getColumnType(coluna);
    }

    /**Fecha a conexão com o banco de dados. */

    public void fecheConnection() throws SQLException,IllegalStateException {
    if(!conexaoComDataBase)
    throw new IllegalStateException(“Conexão com Banco de Dados Fechada”);

     conexao.close();
     execut.close();
     conexaoComDataBase = false;
    

    }

    /*Retorna o objeto Connection com a conexão de banco de dados/
    public Connection getConexao() {
    return conexao;
    }

    public void setConexao(Connection conexao) {
    this.conexao = conexao;
    }

    /**Retorna true se conectado com banco de dados */
    public boolean isConectadoComDataBase() {
    return (!conexaoComDataBase) ? false : true;
    }

    public Statement getExecut() {
    return execut;
    }

    public void setExecut(Statement execut) {
    this.execut = execut;
    }

    public ResultSetMetaData getMetaData() {
    return metaData;
    }

    public void setMetaData(ResultSetMetaData metaData) {
    this.metaData = metaData;
    }

    public ResultSet getResultSet() {
    return resultSet;
    }

    public void setResultSet(ResultSet resultSet) {
    this.resultSet = resultSet;
    }

}//fim da class[/code]

[/quote]