Så her er løsningen:
Hvis du ikke bruger prepare-sætning og bare indsætter ved hjælp af en streng SQL-sætning, har du intet at bekymre dig om, fordi JDBC blot flytter din sætning til MySQL-serveren, og MySQL-serveren kan korrekt parse strengen til usigneret 64-nummer (BigInt-20).
Hvis du bruger en forberedelseserklæring, så er du i problemer. Hvis du gør:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
du vil få en MySqlDataTruncation-undtagelse, fordi JDBC ønsker at afkorte denne til underskrevet lang.
Hvis du gør:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Dette vil fungere, fordi værdien er inden for Java's signed long.
Så en løsning, der altid virker, er:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Du ender med at sende dataene som en streng og lader MySQL-serveren parse dem korrekt.
Nogen burde rette JDBC-driveren, fordi usignerede 64-bit-numre bliver ved med at dukke op i mange statistiske applikationer.