Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserindo um número não assinado de 64 bits na coluna BigInt MySQL usando Java e JDBC


Então aqui está a solução:

Se você não usa a instrução prepare e está apenas inserindo usando uma instrução SQL string, não precisa se preocupar porque o JDBC simplesmente move sua instrução para o servidor MySQL e o servidor MySQL pode analisar corretamente a string para o número 64 não assinado (BigInt-20).

Se você usar uma instrução prepare, então você está com problemas. Se você fizer:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

você receberá uma exceção MySqlDataTruncation porque o JDBC deseja truncar isso para longo assinado.

Se você fizer:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

Isso funcionará porque o valor está dentro do comprimento assinado do Java.

Portanto, a solução alternativa que sempre funciona é:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();

Você acaba passando os dados como uma string e deixa o servidor MySQL analisá-los corretamente.

Alguém deveria consertar o driver JDBC porque números de 64 bits não assinados continuam aparecendo em muitos aplicativos estatísticos.