Hier ist also die Lösung:
Wenn Sie nicht die Prepare-Anweisung verwenden und nur mit einer Zeichenfolge-SQL-Anweisung einfügen, müssen Sie sich keine Sorgen machen, da JDBC Ihre Anweisung einfach auf den MySQL-Server verschiebt und der MySQL-Server die Zeichenfolge korrekt in eine vorzeichenlose 64-Zahl (BigInt-20) analysieren kann.
Wenn Sie eine Prepare-Anweisung verwenden, geraten Sie in Schwierigkeiten. Wenn ja:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Sie erhalten eine MySqlDataTruncation-Ausnahme, da JDBC dies auf signiert lang abschneiden möchte.
Wenn ja:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Dies funktioniert, weil der Wert innerhalb von Javas signiertem Long liegt.
Eine Problemumgehung, die immer funktioniert, ist:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Am Ende übergeben Sie die Daten als String und lassen sie vom MySQL-Server richtig parsen.
Jemand sollte den JDBC-Treiber reparieren, da unsignierte 64-Bit-Zahlen in vielen statistischen Anwendungen immer wieder auftauchen.