sql >> Database teknologi >  >> RDS >> Mysql

Indsættelse af usigneret 64-bit nummer i BigInt MySQL kolonne ved hjælp af Java og JDBC

Så her er løsningen:

Hvis du ikke bruger prepare-sætning og bare indsætter ved hjælp af en streng SQL-sætning, har du intet at bekymre dig om, fordi JDBC blot flytter din sætning til MySQL-serveren, og MySQL-serveren kan korrekt parse strengen til usigneret 64-nummer (BigInt-20).

Hvis du bruger en forberedelseserklæring, så er du i problemer. Hvis du gør:

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

du vil få en MySqlDataTruncation-undtagelse, fordi JDBC ønsker at afkorte denne til underskrevet lang.

Hvis du gør:

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

Dette vil fungere, fordi værdien er inden for Java's signed long.

Så en løsning, der altid virker, er:

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

Du ender med at sende dataene som en streng og lader MySQL-serveren parse dem korrekt.

Nogen burde rette JDBC-driveren, fordi usignerede 64-bit-numre bliver ved med at dukke op i mange statistiske applikationer.



  1. ASP.NET Web Forms og MySql Entity Framework:Indlejrede transaktioner understøttes ikke

  2. Sådan finder du de underliggende primære (eller unikke) nøglekolonner fra en Oracle-visning

  3. CONVERT_TZ() Eksempler – MySQL

  4. Gennemtving indsættelse af poster i flere tabeller