Oto rozwiązanie:
Jeśli nie używasz instrukcji przygotowania, a jedynie wstawiasz ciąg znaków SQL, nie masz się czym martwić, ponieważ JDBC po prostu przenosi Twoją instrukcję na serwer MySQL, a serwer MySQL może poprawnie przeanalizować ciąg do liczby bez znaku 64 (BigInt-20).
Jeśli użyjesz instrukcji przygotowania, masz kłopoty. Jeśli tak:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
otrzymasz wyjątek MySqlDataTruncation, ponieważ JDBC chce skrócić to do długości podpisu.
Jeśli tak:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
To zadziała, ponieważ wartość jest długo podpisana w Javie.
Tak więc obejście, które zawsze działa, to:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
W końcu przekazujesz dane jako ciąg i pozwalasz serwerowi MySQL na ich prawidłowe przeanalizowanie.
Ktoś powinien naprawić sterownik JDBC, ponieważ niepodpisane liczby 64-bitowe wciąż pojawiają się w wielu aplikacjach statystycznych.