Dus hier is de oplossing:
Als u geen gebruikmaakt van de pre-statement en alleen een string invoegt met een SQL-statement, hoeft u zich geen zorgen te maken, omdat JDBC uw instructie eenvoudig naar de MySQL-server verplaatst en de MySQL-server de string correct kan ontleden naar een niet-ondertekend 64-nummer (BigInt-20).
Als je een voorbereidingsverklaring gebruikt, heb je een probleem. Als je dat doet:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
je krijgt een MySqlDataTruncation-uitzondering omdat JDBC dit wil afkappen tot ondertekend lang.
Als je dat doet:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Dit zal werken omdat de waarde binnen Java's Signed Long ligt.
Dus een tijdelijke oplossing die altijd werkt is:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Uiteindelijk geef je de gegevens door als een string en laat je de MySQL-server ze correct ontleden.
Iemand zou het JDBC-stuurprogramma moeten repareren, want niet-ondertekende 64-bits nummers komen steeds terug in veel statistische toepassingen.