Ето го решението:
Ако не използвате оператор за подготовка и просто вмъквате с помощта на SQL оператор за низ, няма за какво да се притеснявате, защото JDBC просто премества оператора ви към MySQL сървър и MySQL сървърът може правилно да анализира низа до неподписано 64 число (BigInt-20).
Ако използвате изявление за подготовка, тогава сте в беда. Ако го направите:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
ще получите изключение MySqlDataTruncation, защото JDBC иска да съкрати това до signed long.
Ако го направите:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Това ще работи, защото стойността е в рамките на дългия знак на Java.
Така че заобиколното решение, което винаги работи, е:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
В крайна сметка предавате данните като низ и оставяте MySQL сървъра да ги анализира правилно.
Някой трябва да поправи JDBC драйвера, защото неподписани 64-битови числа продължават да се появяват в много статистически приложения.