2016-08-08 47 views
2

Wie pro MySQL docs, der Maximalwert für Unsinged Bigint = 18446744073709551615Ausgabe mit UNSIGNED BIGINT von MySQL während mit JDBC Client Abrufen

I eingefügt Wert 9223372036854776900 (weit niedriger als Grenzwert MAX) in einem unsinged Bigint Säule.

Es wird kein Fehler angezeigt.

Als ich versuchte es über JDBC-Client programmatisch zuzugreifen, ich habe Ausnahme:

com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: außerhalb '9223372036854776900' in Spalte ist '10' gültiger Bereich für den Datentyp BIGINT. bei sun.reflect.NativeConstructorAccessorImpl.newInstance0 (native Methode) bei sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) bei sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) auf Java. lang.reflect.Constructor.newInstance (Constructor.java:422) bei com.mysql.jdbc.Util.handleNewInstance (Util.java:411) bei com.mysql.jdbc.Util.getInstance (Util.java:386) bei com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1026) bei com.mysql.jdbc.SQLError.createSQLException (SQLError.java:987) bei com.mysql.jdbc.SQLError.createSQLException (SQLError. Java: 982) a t com.mysql.jdbc.SQLError.createSQLException (SQLError.java:927) bei com.mysql.jdbc.ResultSetImpl.throwRangeException (ResultSetImpl.java:7964) bei com.mysql.jdbc.ResultSetImpl.parseLongAsDouble (ResultSetImpl.java : 7248) bei com.mysql.jdbc.ResultSetImpl.getLong (ResultSetImpl.java:2946) bei com.mysql.jdbc.ResultSetImpl.getLong (ResultSetImpl.java:2911)


MySQL Version: 5.5.41-0ubuntu0.14.04.1

+0

Welche Version von MySQL, JDBC-Treiber, Java? – phn

+0

@phn ** 5.1 **. Könnte das hier ein Schuldiger sein? –

Antwort

2

Wie der Stack-Trace vorgeschlagen, konnte ich das Problem neu erstellen, wenn ich ResultSet#getLong

zu verwenden versucht,
Long l = rs.getLong(1); 

weil der gespeicherte Wert, 9223372036854776900, für eine größer ist als der Maximalwert ist (signiert) Long in Java: 9223372036854775807.

Allerdings konnte ich erfolgreich den Wert als BigDecimal

java.math.BigDecimal bd = rs.getBigDecimal(1); 

oder als BigInteger mit Abrufen mit

java.math.BigInteger bi = (java.math.BigInteger) rs.getObject(1); 
+1

erwähnt. Offensichtlich, wie das OP tatsächlich 'getLong' nennt. Eigentlich ein Fehler, der sehr nett ist. –

1

Der maximale Wert von BIGINT ist 9223372 036854775807.

von der Oracle-Dokumentation (Mapping SQL and Java Types)

8.3.7 BIGINT Der JDBC stellt Typ BIGINT eine 64-Bit-Ganzzahl mit Vorzeichen Wert zwischen -9223372036854775808 und 9223372036854775807.

Die entsprechenden SQL-Typ BIGINT ist eine nicht standardmäßige Erweiterung von SQL. In der Praxis ist der SQL BIGINT-Typ derzeit noch nicht von einer der Hauptdatenbanken implementiert, und wir empfehlen, seine Verwendung in Code zu vermeiden, der portabel sein soll.

Das empfohlene Java-Mapping für den BIGINT-Typ ist wie ein Java-Long.

Es gibt eine Lösung auf eine andere Frage gestellt, die nützlich sein könnten Sie: Inserting unsigned 64-bit number into BigInt MySQL column using Java and JDBC

+0

Ich habe klar 'ungesungene Bigint'-Spalte –

1

Sie finden Ihre Antwort in der folgenden Tabelle der Webseite http://www.mysqlab.net/knowledge/kb/detail/topic/java/id/4929

Tabelle A.2. Unsigned Types Mapping

 Data TypeJava Type 
    TINYINT UNSIGNED  java.lang.Integer 
    SMALLINT UNSIGNED  java.lang.Integer 
    MEDIUMINT UNSIGNED java.lang.Long 
    INT UNSIGNED   java.lang.Long 
    BIGINT UNSIGNED  java.math.BigInteger
Hinweis: Vor MySQL Connector/J 3.1.3 wurde BIGINT UNSIGNED auf java.math.BigDecimal gemappt.