Olá a todos, estou tendo um problema no meu BD, estou criando um projeto em Java que se conecta ao Banco de dados via JDBC, utilizo NetBeans e MySQL Workbench.
O problema é eu tenho um valor do tipo long em uma variável no código Java e tenho um atributo também do tipo long em uma tabela no Banco de Dados. Meu código em Java para inserir o valor no BD está funcionando e inserindo, mas quando o valor long é grande demais me retorna um erro no MySQL dizendo que o número está fora do intervalo para o tipo Integer (Mesmo eu não utilizando Integer).
Segue a mensagem de erro:
com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: ‘7.4937689979790541E17’ in column ‘1’ is outside valid range for the datatype INTEGER.
No Java o número é apresentado corretamente, mas quando é passado para um atributo do tipo long no BD diz que o número é esse ai de cima.
Alguém sabe o por que disso ?
Qual o tipo do dado no MySQL? Tentou utilizar BIGINT UNSIGNED
?
Tanto no Java quanto no MySQL o tipo utilizando foi o mesmo, long em ambos, testei de várias maneiras, como Big, long, double etc… Todos retornam o mesmo erro quando o número passado pelo Java é muito grande.
Tentou BIGINT UNSIGNED
? Desculpe responder a pergunta, mas você não falou nesse!
Ok, usei também, me retornou o mesmo erro sobre integer… (mesmo não usando nada de integer).
O BIGINT do MySQL tem 8 bytes, exatamente o mesmo tamanho do long do Java. Não era para dar problema.
Pois é…
Eu li em um fórum inglês o seguinte:
JDBC teve problemas com o BIGINT e long conversão como ele não sabe como determinar se é signed ou unsigned e usa INT em vez de LONG…
Então é um bug mesmo! Será que não tem nenhum workaround? Algo como um cast explícito.
Não sei, até agora não encontrei… Vou procurar se acho algo senão terei que quebrar a cabeça mesmo para contornar isso.
Só para constar, não encontrei nenhuma solução do bug em sí, mas encontrei a solução de converter tudo (até no atributo do BD) para String, assim não ocorre o bug de estar usando long ou BigInteger e acusar que está sendo usado Integer quando os números são muito grandes.
PS:pelo que me consta descobri que se trata de um bug no próprio NetBeans, pois ele joga erroneamente um tipo long para Integer.
Alguém sabe onde posso denunciar o bug ?
aqui : https://netbeans.org/community/issues.html
você chegou a testar outra ide como eclipse, outra versão do driver JDBC do MySQL
{ },.s
Obrigado pelo link, ainda não pude testar para confirmar que se trata realmente do NetBeans, como li em vários fóruns ingleses, vou fazer o teste em pouco tempo e se for realmente do NetBeans irei reportar o bug.
1 curtida
Pessoal só para esclarecer sobre esse bug no NetBeans, acabei de fazer o teste aqui no Eclipse e consegui concluir que realmente se trata de um bug no NetBeans, quando o valor do tipo long é muito alto o NetBeans interpreta erroneamente esse valor como um valor do tipo Integer e por isso causa o erro.
Testado no Eclipse correu tudo normal e os valores foram inseridos no Banco de Dados normalmente como deveria ser (do tipo long).
Por isso para quem irá realizar operações com números muito grande via JDBC não recomendo utilizar o NetBeans.
O NetBeans não deveria interferir no teu programa, teoricamente. Quem faz a interpretação do número durante o runtime é a JVM. Onde é que tá dando esse erro?
Quem é que tá fazendo a consulta, é você no código ou a IDE através de algum plugin ou ferramenta?
Eu recebo um número do tipo long e então eu passo esse número para o BD. No NetBeans quando o número não é muito grande ele insere no BD tranquilo, mas quando é grande me retorna um erro dizendo que o número está fora do intervalo do tipo Integer, mesmo em nenhuma parte do código nem no BD ter nada sobre Integer, apenas long.
Testado em outra IDE (Eclipse) com os mesmos códigos não tive problema nenhum, com os mesmos números passados.
Mas cara, você consegue perceber que esse bug não deveria ter nada a ver com a IDE, mas sim com o runtime da JVM? Em teoria, a IDE não devia ter absolutamente nada a ver com os dados que trafegam dentro da tua aplicação, a não ser numa situação de debug, mas ainda assim!
Se funciona no Eclipse, então quer dizer que o erro não é na JVM. Quer dizer que o NetBeans tá se metendo onde não deve, de alguma forma. É difícil pra mim identificar esse ponto sem mais contexto.
Quando você fala:
Eu não sei se você tá utilizando teu programa, o que você tá escrevendo, utilizando a API JDBC para fazer a comunicação com o DB de forma programática; ou se você tá usando alguma ferramenta do NetBeans para manipular o banco de dados.
No primeiro caso, o NetBeans não tem nada a ver com teu código, deveria funcionar independente da IDE. No segundo sim, faz sentido o problema ser no NetBeans.
Me dá um pouco mais de contexto pra gente descobrir, porque to bem curioso!
Eu também estou curioso pois concordo com você… O que eu faço:
Eu recebo os números aleatórios (grandes ou pequenos) coloco em um atributo do tipo long e então utilizando o Insert via java envio para o BD. Segue o exemplo do código para inserir no BD:
stmt = conectar.prepareStatement(“Insert Into user (id) Values (?)”);
stmt.setLong(1, id);
E então stmt.executeUpdate();
Mas é essa a parte que dá erro? Ou é na hora que você faz um SELECT
?
EDIT: esquece, entendi errado. É nessa parte, só quando o id é grande, isso?
Cola o stack trace inteiro, não só aquela mensagem de erro ali, talvez apareça algo.
Inclusive, se você quiser e puder (caso não seja algo importante/confidencial), me manda o projeto todo que dou uma fuçada hahahaha