Så här är lösningen:
Om du inte använder prepare-satsen och bara infogar med en sträng SQL-sats, har du inget att oroa dig för eftersom JDBC helt enkelt flyttar din sats till MySQL-servern och MySQL-servern kan korrekt tolka strängen till osignerat 64-nummer (BigInt-20).
Om du använder ett förbereda uttalande, då är du i trubbel. Om du gör det:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
du kommer att få ett MySqlDataTruncation-undantag eftersom JDBC vill trunkera detta till signerad lång.
Om du gör det:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Detta kommer att fungera eftersom värdet är inom Javas signerade långa.
Så en lösning som alltid fungerar är:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Det slutar med att du skickar data som en sträng och låter MySQL-servern analysera den ordentligt.
Någon borde fixa JDBC-drivrutinen eftersom osignerade 64-bitars nummer fortsätter att dyka upp i många statistiska applikationer.