conexão ao mysql via codigo java em latin1

5 respostas
A

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

/*
 * 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

5 Respostas

B

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.

A

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.

B

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.

A

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: [email removido]

A
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

/*
 * 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

Criado 26 de janeiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 5
Participantes 2