Mysql
 sql >> Database >  >> RDS >> Mysql

Inserimento di un numero a 64 bit senza segno nella colonna BigInt MySQL utilizzando Java e JDBC

Quindi ecco la soluzione:

Se non usi l'istruzione prepare e stai solo inserendo un'istruzione SQL stringa, non hai nulla di cui preoccuparti perché JDBC sposta semplicemente la tua istruzione sul server MySQL e il server MySQL può analizzare correttamente la stringa in un numero 64 senza segno (BigInt-20).

Se usi una dichiarazione di preparazione, allora sei nei guai. Se lo fai:

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

otterrai un'eccezione MySqlDataTruncation perché JDBC vuole troncare questo in modo che sia firmato a lungo.

Se lo fai:

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

Funzionerà perché il valore è all'interno di Java firmato long.

Quindi la soluzione alternativa che funziona sempre è:

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

Si finisce per passare i dati come una stringa e lasciare che il server MySQL li analizzi correttamente.

Qualcuno dovrebbe riparare il driver JDBC perché i numeri a 64 bit senza segno continuano a comparire in molte applicazioni statistiche.