Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion d'un numéro 64 bits non signé dans la colonne BigInt MySQL à l'aide de Java et JDBC

Voici donc la solution :

Si vous n'utilisez pas l'instruction de préparation et que vous insérez simplement à l'aide d'une instruction SQL de chaîne, vous n'avez rien à craindre car JDBC déplace simplement votre instruction vers le serveur MySQL et le serveur MySQL peut analyser correctement la chaîne en un nombre 64 non signé (BigInt-20).

Si vous utilisez une instruction de préparation, vous avez des problèmes. Si vous le faites :

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

vous obtiendrez une exception MySqlDataTruncation car JDBC veut tronquer ceci en long signé.

Si vous le faites :

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

Cela fonctionnera car la valeur est comprise dans la longueur signée de Java.

Donc, la solution de contournement qui fonctionne toujours est :

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

Vous finissez par transmettre les données sous forme de chaîne et laissez le serveur MySQL les analyser correctement.

Quelqu'un devrait réparer le pilote JDBC, car des nombres 64 bits non signés continuent d'apparaître dans de nombreuses applications statistiques.