Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfügen einer vorzeichenlosen 64-Bit-Zahl in die BigInt-MySQL-Spalte mit Java und JDBC

Hier ist also die Lösung:

Wenn Sie nicht die Prepare-Anweisung verwenden und nur mit einer Zeichenfolge-SQL-Anweisung einfügen, müssen Sie sich keine Sorgen machen, da JDBC Ihre Anweisung einfach auf den MySQL-Server verschiebt und der MySQL-Server die Zeichenfolge korrekt in eine vorzeichenlose 64-Zahl (BigInt-20) analysieren kann.

Wenn Sie eine Prepare-Anweisung verwenden, geraten Sie in Schwierigkeiten. Wenn ja:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

Sie erhalten eine MySqlDataTruncation-Ausnahme, da JDBC dies auf signiert lang abschneiden möchte.

Wenn ja:

BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

Dies funktioniert, weil der Wert innerhalb von Javas signiertem Long liegt.

Eine Problemumgehung, die immer funktioniert, ist:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();

Am Ende übergeben Sie die Daten als String und lassen sie vom MySQL-Server richtig parsen.

Jemand sollte den JDBC-Treiber reparieren, da unsignierte 64-Bit-Zahlen in vielen statistischen Anwendungen immer wieder auftauchen.