Takže tady je řešení:
Pokud nepoužíváte příkaz Prepare a pouze vkládáte pomocí SQL příkazu řetězce, nemáte se čeho obávat, protože JDBC jednoduše přesune váš příkaz na server MySQL a server MySQL může správně analyzovat řetězec na číslo 64 bez znaménka (BigInt-20).
Pokud použijete příkaz připravit, pak máte potíže. Pokud tak učiníte:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
získáte výjimku MySqlDataTruncation, protože JDBC to chce zkrátit na sign long.
Pokud tak učiníte:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
To bude fungovat, protože hodnota je v rámci Java's sign long.
Takže řešení, které vždy funguje, je:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Nakonec předáte data jako řetězec a necháte MySQL server, aby je správně analyzoval.
Někdo by měl opravit ovladač JDBC, protože v mnoha statistických aplikacích se stále objevují 64bitová čísla bez znaménka.