# [HSQL] Numeric value out of range



## Milo (16. Mai 2010)

Hallo,

ich experimentiere erstmalig mit HSQL und JAVA. Bei einen meiner Versuche habe ich eine "Numeric value out of range" Exception bekommen. Die Tabelle besteht (bis auf die ID) nur aus DOUBLE-Werten. Die beiden mit Abstand größten Werte waren E17 und E23. Wo kann ich nachlesen, wie groß der Definitionsbereich ist bei HSQL? In der Doku habe ich so nichts gefunden. Solche Werte sind im Übrigen die absolute Ausnahme und kommen im Normalfall nicht vor! 

Wie umgehe ich diese Ausnahme geschickt? Muss ich jeden Double-Wert, den ich eintrage, vorab prüfen, ob er in ein bestimmtes Intervall fällt? Gibt es ggf. einen besseren Datentyp für meine Anwendung? Rein zum Verständnis: Warum kann ich meine Berechnung in JAVA noch problemlos durchführen und bekomme erst beim Speichern in der Datenbank Probleme mit dem Typ? 

Wäre nett, wenn mir einer ein wenig auf die Sprünge hilft ;-)
Gruß Micha


----------



## Gelöschtes Mitglied 5909 (16. Mai 2010)

Hat die Spalte in der DB den richtigen Typ?


----------



## Milo (16. Mai 2010)

Hi raiL,

Danke für Deine Antwort. Ich habe die Tabelle in OOO zusammengebaut und hänge mal einen Screenshot ran. Alle Spalten haben DOUBLE-Werte (Bis auf die erste und letzte). 

Gruß Micha


----------



## Gelöschtes Mitglied 5909 (16. Mai 2010)

> In HyperSQL, REAL, FLOAT, DOUBLE are equivalent and all mapped to double in Java. These types are defined by the SQL Standard as approximate numeric types. The bit-precision of all these types is 64 bits.



mh das ist sehr strange. hast du mal versucht mit nem sql client so einen wert zu inserten? Mach mal eine hsqldb auf mit einer tabelle/spalte und füge den wert ein der fehlschlägt.


----------



## Milo (16. Mai 2010)

Hallo raiL,



raiL hat gesagt.:


> hast du mal versucht mit nem sql client so einen wert zu inserten?


Ja, da kommt die selbe Fehlermeldung (siehe Screenshot). Ich habe das INSERT genommen, welches aus meiner Java-Anwendung heraus erzeugt wurde und fehlschlug. Die Werte selbst werden also innerhalb der Anwendung bestimmt.

Micha


----------



## Gelöschtes Mitglied 5909 (16. Mai 2010)

tja dass sieht dann für mich so aus als wäre die Zahl wirklich zu groß. Ich frage mich nur, ob der Wert dann in deiner Java App in das Double passt oder ob du einnen overflow hast, ihn aber nicht bemerkst.



> DECIMAL and NUMERIC with decimal fractions are mapped to java.math.BigDecimal and can have very large numbers of digits. In HyperSQL the two types are equivalent. These types, together with integral types, are called exact numeric types.



Probier doch mal einen der beiden Typen aus, vielleicht gehts damit


----------



## Milo (16. Mai 2010)

Hi,



raiL hat gesagt.:


> Ich frage mich nur, ob der Wert dann in deiner Java App in das Double passt oder ob du einnen overflow hast, ihn aber nicht bemerkst.


Die großen Zahlen deuten schon darauf hin, dass bei der Berechnung etwas schief gelaufen ist. Der Nutzer soll das aber auch bemerken (also sehen) und soll nicht mit einer Fehlermeldung, dass sich die Daten nicht speichern ließen, irritiert werden. Wenn ich mit Double.MAX_Value ausgeben lasse (1.7976931348623157E308), habe ich wohl noch Spielraum beim Speichern, oder kann ich hier so nicht argumentieren?



raiL hat gesagt.:


> Probier doch mal einen der beiden Typen aus, vielleicht gehts damit


Nein, Kanonen auf Spatzen, würde ich sagen ;-)

Gruß Micha


----------



## Milo (20. Mai 2010)

Hallo,

ich habe das Prolem nun in den Griff bekommen, indem ich mit einem PreparedStatement arbeite. Vorher hatte ich die SQLs per String.format(...) zusammengebaut - nun gehts, wie ich es wollte.

Schöne Grüße


----------

