sql >> Databasteknik >  >> RDS >> Mysql

Infogar osignerat 64-bitars nummer i BigInt MySQL-kolumnen med Java och JDBC

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.



  1. Hur man delar en sträng i MySQL

  2. CDbCriteria-parametrar med regex-teckenklasser

  3. 1-1 Chattsystem som använder PHP/MySQL

  4. Inaktivera PostgreSQL-kontroller av främmande nyckel för migrering