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.