sql >> Databáze >  >> RDS >> Mysql

Vložení 64bitového čísla bez znaménka do sloupce BigInt MySQL pomocí Java a JDBC

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.



  1. Třídění SQL se neřídí skupina po příkazu, vždy používá primární klíč

  2. Vložit do postgres SQL

  3. jak implementovat dědičnost tabulky v GreenDao

  4. Verze Postgres nejsou kompatibilní