sql >> Database >  >> RDS >> Mysql

Een niet-ondertekend 64-bits nummer in de BigInt MySQL-kolom invoegen met Java en JDBC

Dus hier is de oplossing:

Als u geen gebruikmaakt van de pre-statement en alleen een string invoegt met een SQL-statement, hoeft u zich geen zorgen te maken, omdat JDBC uw instructie eenvoudig naar de MySQL-server verplaatst en de MySQL-server de string correct kan ontleden naar een niet-ondertekend 64-nummer (BigInt-20).

Als je een voorbereidingsverklaring gebruikt, heb je een probleem. Als je dat doet:

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

je krijgt een MySqlDataTruncation-uitzondering omdat JDBC dit wil afkappen tot ondertekend lang.

Als je dat doet:

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

Dit zal werken omdat de waarde binnen Java's Signed Long ligt.

Dus een tijdelijke oplossing die altijd werkt is:

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

Uiteindelijk geef je de gegevens door als een string en laat je de MySQL-server ze correct ontleden.

Iemand zou het JDBC-stuurprogramma moeten repareren, want niet-ondertekende 64-bits nummers komen steeds terug in veel statistische toepassingen.



  1. oracle-procedure met behulp van de opdracht Host()

  2. Zoeken op volledige naam of voor- of achternaam in MySQL-database met voor- en achternaam in aparte kolommen

  3. Heeft de volgorde van kolommen in een select-instructie invloed op de querysnelheid?

  4. Laravel 5.1 Migratie en Seeding Kan een tabel waarnaar wordt verwezen in een externe sleutelbeperking niet afkappen