sql >> Base de Datos >  >> RDS >> Mysql

Insertar un número de 64 bits sin firmar en la columna BigInt MySQL usando Java y JDBC

Así que aquí está la solución:

Si no usa la declaración de preparación y solo está insertando usando una declaración SQL de cadena, no tiene nada de qué preocuparse porque JDBC simplemente mueve su declaración al servidor MySQL y el servidor MySQL puede analizar correctamente la cadena al número 64 sin firmar (BigInt-20).

Si usa una declaración de preparación, entonces está en problemas. Si lo hace:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

obtendrá una excepción MySqlDataTruncation porque JDBC quiere truncar esto para firmar mucho.

Si lo hace:

BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

Esto funcionará porque el valor está dentro del largo firmado de Java.

Entonces, la solución que siempre funciona es:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();

Terminas pasando los datos como una cadena y dejas que el servidor MySQL los analice correctamente.

Alguien debería reparar el controlador JDBC porque siguen apareciendo números de 64 bits sin firmar en muchas aplicaciones estadísticas.